[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...