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)?
-
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_Nodein 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?
-
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