Template Klasse zum Freudn einer template Klasse erklären



  • Hi,
    ich habe folgendes Problem.
    Zwei Template Klassen A und B sind gegeben.
    Jetzt möchte ich, dass Klasse B Freund von Klasse A ist.
    Leider bekomme ich das nicht hin. Folgendes habe ich in einer PDF Datei gefunden.

    [b]How do I specify a friend template class?[/b]
    Like that:
    
    class A
    {
      template<class> friend class B; 
      friend class B <class T>;
    };
    
    Alexis Angelidis (PhD) 2005-01-11
    

    Aber das funktioniert nicht. Warscheinlich weil bei mir beide Klassen Template Klassen sind.

    Weiß einer Rat?
    Ein Beispiel anhand dieser Klassen wäre super.

    template< class T >
    class A
    {
    
    };
    
    template< typename T >
    class B
    {
    
    };
    

    mfg



  • Hallo!

    Der Code aus der PDF-Datei stimmt schon einigermaßen. Er zeigt auch die beiden Möglichkeiten auf ein Klassen-Templates als friend zu deklarieren.

    Angenommen du hast das Klassentemplate B

    template< typename T >
    class B
    {
    
    };
    
    1. Dann kannst du einmal dafür sorgen, dass ALLE Instanzen des Templates B friend von allen Instanzen des Templates A sind:
    template< class T >
    class A
    {
        template <class TT> friend class B;
    
    };
    

    Man beachte die unterschiedlichen Template-Parameter T und TT.

    1. Die zweite Möglichkeite ist, dass eine Instanz A mit einem bestimmten Typ nur die jeweilige Instanz B mit gleichem Typ zum friend hat.
    template< class T>
    class A
    {
        friend class B<T>;
    
    };
    

    Z.B. wäre B<int> friend von A<int> aber nicht friend von A<string>.

    Gruß




  • Mod

    vic1986 schrieb:

    1. Die zweite Möglichkeite ist, dass eine Instanz A mit einem bestimmten Typ nur die jeweilige Instanz B mit gleichem Typ zum friend hat.
    template< class T>
    class A
    {
        friend class B<T>;
    
    };
    

    Eine friend Deklaration darf beliebige explizite Spezialisierungen benennen, denn das sind ganz normale Klassen oder Funktionen, nicht nur solche mit passendem Templateparameter. Eine Spezialisierung (explizit oder partiell) kann nicht deklariert werden, bevor das Primärtemplate deklariert wurde, also brauchen wir eine solche Deklaration zuvor.

    template <class T> class B;
    template< class T>
    class A
    {
        friend class B<T>;   // ok
        friend class B<int>; // ok
        friend class B<T*>;  // ok
    };
    

    Eine friend-Deklaration kann sich auf ein gesamtes Template beziehen, nicht aber auf partielle Spezialisierungen:

    template< class T > class B;
    template< class T >
    class A
    {
        template <class TT> friend class B; // ok
        template <class TT> friend class B<TT*>; // Fehler
        template <class TT> friend class B<TT>; // Fehler
    };
    


  • camper schrieb:

    ... Eine friend Deklaration darf beliebige explizite Spezialisierungen benennen ...

    Ja, wenn man meinen Beitrag liest, könnte man auf die Idee kommen, dass nur eine Spezialisierung mit demselben Typ möglich ist. Das hab ich etwas "unglücklich" ausgedrückt.

    Danke für die Ergänzung. 🙂



  • Vielen Dank 🙂

    Wäre vielleicht etwas fürs FAQ. Müsste nur die Überschrift angepasst werden.


Anmelden zum Antworten