[gelöst] eine template-klasse friend einer anderen template-klasse (bei gleichem template-Typ)
-
Hallo zusammen,
ich habe eine Klassentemplate A und ein Klassentemplate B, also
template <class T> class A { private: A(); } template <class T> class B { public: B(); }
Wie man sieht, kann A nicht so einfach erstellt werden, das soll nämlich nur die Klasse B machen dürfen.
Außerdem soll nicht jede Template-Klasse vom Klassentemplate B jede Template-Klasse vom Klassentemplate A instanziieren dürfen, sondern nur Template-Klassen gleichen Typs.
Das bedeutet also:
Erlaubt:
B vom Typ int darf A vom Typ int erstellen.
Nicht erlaubt:
B vom Typ string darf A vom Typ int erstellen.Wie schreibt man dies in C++?
Schon versucht:
template <class T> class A { friend class B<T>; }
template <class T> class A { template <class T> friend class B<T>; }
template <class T> class A { template <class T> friend class B; }
EDIT: Unten steht die richtige Lösung dafür.
-
*delete*
-
*delete*
-
Schon versucht:
Und was waren die jeweiligen Fehlermeldungen? typischer Fall von "geht nicht".
Der erste Veruch war schon richtig, B muss nur sichtbar sein bevor es für A als friend deklariert werden kann:
template <class T> class B; template <class T> class A { private: A(); friend class B<T>; }; template <class T> class B { public: B(); };
-
Was hat das mit Factory zu tun?
Edit: pumuckl hat die Antwort schon gegeben... Ich war wohl etwas lange abwesend...
-
pumuckl schrieb:
Schon versucht:
Und was waren die jeweiligen Fehlermeldungen? typischer Fall von "geht nicht".
Ups, stimmt, Fehlermeldungen wären toll. *hust*
Also:
Schon versucht:template <class T> class A { friend class B<T>; }
Fehler:
B ist kein Template.
Template-Argument für struct B benötigt.template <class T> class A { template <class T> friend class B<T>; }
Fehler:
B ist kein Template.
Template-Argument für struct B benötigt.template <class T> class A { template <class T> friend class B; }
Fehler:
überdeckt Templateparameter <class T>
Deklaration von class TWar wohl typischer Fall von "alle möglichen Kombinationen ausprobiert, nur nicht die richtige."
Hatte es nämlich auch schon mit Forward-Deklaration probiert
-
wie gesagt, Nr 1 wäre richtig, mit Deklaration des templates B vorweg...