Template-Klasse als Friend einer Template-Klasse



  • Hallo,

    ich habe zwei Template-Klassen (oder nennt man die Klassentemplates?)

    template<class N, class C, class T> class Base_Node
    {
    private:
    	T* m_tree;
    	...
    public:
    	void set_active();	
    	...
    }
    
    template<class N, class C, class T> void Base_Node<N, C, T>::set_active() 
    { 
    	m_tree->m_num_act_nodes++;
    }
    

    und

    template<class N, class C> class Base_Tree
    {
    private:
    	int m_num_act_nodes;
    	...
    }
    

    Bei den Instanzen von Base_Node wird für T eine aus Base_Tree abgeleitete (Nicht-Template-)Klasse eingesetzt, z.B.:

    class Tree : public Base_Tree<Node, Node_Container>
    class Node : public Base_Node<Node, Node_Container, Tree>
    

    Mein Problem ist nun, dass ich ohne Base_Node als Friend in Base_Tree zu deklarieren, die Fehlermeldung

    ‘int Base_Tree<Node, Node_Container>::m_num_act_nodes’ is private

    erhalte (was nicht überrascht).

    Daher: Kann mir jemand sagen, wie die Friend-Deklaration von Base_Node in Base_Tree aussehen müsste (und ggf. ob man das so macht oder es schlechter Stil ist)?


  • Mod

    template<class N, class C> class Base_Tree
    {
    private:
        int m_num_act_nodes;
        ...
    // friend-Deklarationen dürfen keine partiellen Spezialisierungen deklarieren, deshalb nicht:
    //    template<typename T>
    //    friend class Base_Node< N, C, T >;
    // wir müssen also mehr Freunde als eigentlich nötig 
    // (nämlich sämtliche Spezialisierungen des Templates Base_Node, nicht nur solche mit kompatiblen Templateparamtern) in Kauf nehmen:
        template<typename NN, typename CC, typename T>
        friend class Base_Node< NN, CC, T >;
    }
    

    An solchen friend-Deklarationen ist grundsätzlich nichts auszusetzen - ob sie im konkreten Fall sinnvoll sind, steht auf einem anderen Blatt.

    Base_Node und Base_Tree sind Templates, genauer: Klassentemplates, weil sie Klassen generieren. Explizite Spezialisierungen dieser Templates sind Klassen, genauer: Templateklassen, weil sie aus Templates entstehen. Eigentlich ganz einfach 😉



  • Wenn ich

    template<typename NN, typename CC, typename T> friend class Base_Node
    

    in Base_Tree einfüge, erhalte ich die Fehlermeldung

    partial specialization ‘Base_Node<NN, CC, T>’ declared ‘friend’

    bezüglich dieser Zeile.

    Weiss jemand, wie das zu interpretieren ist?


  • Mod

    Muss ein einfacher C&P&Edit-Fehler sein, in Kommentar steht es ja: eine friend-Deklaration darf keine partielle Spezialisierung deklarieren. Folglich

    template<typename, typename, typename>
        friend class Base_Node;
    


  • camper schrieb:

    Base_Node und Base_Tree sind Templates, genauer: Klassentemplates, weil sie Klassen generieren. Explizite Spezialisierungen dieser Templates sind Klassen, genauer: Templateklassen, weil sie aus Templates entstehen. Eigentlich ganz einfach 😉

    Und noch einfacher wird's, wenn man für "Template" das deutsche Wort "Vorlage" einsetzt 🙂



  • Sagt mal... Kennt ihr beide euch eigtl? ^^



  • unskilled schrieb:

    Sagt mal... Kennt ihr beide euch eigtl? ^^

    Wen meinst du jetzt? Also ich kenne jedenfalls niemanden hier von dem Board 🙂



  • Badestrand schrieb:

    camper schrieb:

    Base_Node und Base_Tree sind Templates, genauer: Klassentemplates, weil sie Klassen generieren. Explizite Spezialisierungen dieser Templates sind Klassen, genauer: Templateklassen, weil sie aus Templates entstehen. Eigentlich ganz einfach 😉

    Und noch einfacher wird's, wenn man für "Template" das deutsche Wort "Vorlage" einsetzt 🙂

    Ich bevorzuge die direkte Übersetzung „Schablone“, das drückt IMHO besser aus, was da passiert. Ne Vorlage kann alles mögliche sein. Eine Schablone ist im technischen Sinn schon wesentlich spezifischer.



  • Badestrand schrieb:

    unskilled schrieb:

    Sagt mal... Kennt ihr beide euch eigtl? ^^

    Wen meinst du jetzt? Also ich kenne jedenfalls niemanden hier von dem Board 🙂

    Dich und camper ^^ Iwie habt ihr gewisse Parallelen - naja, egal ^^

    bb


Anmelden zum Antworten