Template als Freund



  • Hi!

    Ich möchte ein Klassen-Template zum Freund einer Klasse machen.... aber wie?

    Das hier funktioniert nicht:

    class a
    {
    private:
       int x;
    
       friend class b;
    };
    
    template <typename T> class b
    {
    public:
       void f(const a& obj)
       {
          obj.x = 10;
       }
    };
    

    c:\Repository\threadeventqueue.h(295): error C2989: 'CachedThreadEventQueue' : template class has already been defined as a non-template class

    Ich schaffe es nicht, die friend deklaration entsprechend zu modifizieren. Ich will aber auf keinen Fall für jede template-instanziierung eine eigene friend deklaration reinschreiben 😞

    Jemand ne idee?



  • template<class T>
    class a 
    { 
    private: 
       int x; 
    
       friend class T; 
    }; 
    
    template <typename T> class b 
    { 
    public: 
       void f(const a& obj) 
       { 
          obj.x = 10; 
       } 
    };
    


  • balduin schrieb:

    template<class T>
    class a 
    { 
    private: 
       int x; 
    
       friend class T; 
    }; 
    
    template <typename T> class b 
    { 
    public: 
       void f(const a& obj) 
       { 
          obj.x = 10; 
       } 
    };
    

    Grübel. Anders geht das nicht?

    Zugegeben, besser als jeden Instanziierung von b als friedn reinschreiben zu müssen.

    Aber ich will eigentlich vermeiden "a" auch noch überall mit einem typenamen instanzieren zu müssen.

    Mal abgesehen davon... erzeugt das nicht zusätzlichen Code? Hier würde doch (für jede Variation des Friend) eine neue Instanz des a-Templates erzeugt, oder nicht?



  • Wenn du eine Template Klasse hast, musst du diese auch als Template angeben.

    class a
    {
    private:
       int x;
    
       template <typename T>
       friend class b;
    };
    
    template <typename T> class b
    {
    public:
       void f(const a& obj)
       {
          obj.x = 10;
       }
    };
    


  • Jordy schrieb:

    balduin schrieb:

    template<class T>
    class a 
    { 
    private: 
       int x; 
    
       friend class T; 
    }; 
    
    template <typename T> class b 
    { 
    public: 
       void f(const a& obj) 
       { 
          obj.x = 10; 
       } 
    };
    

    Grübel. Anders geht das nicht?

    Wie es richtig geht hat groovemaster ja bereits beschrieben. Die zitierte Variante ist hingegen nicht nur umständlch, sondern das friend class T; ist derzeit schlicht kein legales C++. Habe zwar schon häufiger gelesen, dass sich dies mit dem nächsten Standard ändern wird, aber bis zum nächsten Standard ist noch ein bischen Zeit.



  • Verflixt nochmal.

    template <typename T>
       friend class b;
    

    War das erste, was ich probiert habe. Nur habe ich das "friend" an den Anfang der zeile gesetzt, nicht das "template". Argh. Blind wie ein Maulwurf.

    Vielen Dank nochmal!


Log in to reply