ist es möglich, eine partielle Template-Spezifikation irgendwie zu einer Freundesklasse zu machen? I.e. ist für Sie das folgende Template-Klasse habenC++ - Templates: Partielle Template-Spezifikationen und Friend-Klassen
template <class T> class X{
T t;
};
Jetzt haben Sie teilweise Spezialisierungen zum Beispiel für Zeiger
template <class T> class X<T*>{
T* t;
};
Was ich erreichen will, ist, dass jeder mögliche X<T*>
ein Freund Klasse von X<S>
für ANY ist S
. I.e. X<A*>
sollte ein Freund von X<B>
sein.
Natürlich, dachte ich über eine gewöhnliche Vorlage Freund Erklärung in X:
template <class T> class X{
template <class S> friend class X<S*>;
}
Dies ist jedoch nicht kompiliert, g ++ sagt mir dies:
test4.cpp: 34: 15: Fehler : Spezialisierung von 'template<class T> class X
' muss auf Namespacebereich erscheinen
test4.cpp: 34: 21: error: Teil Spezialisierung 'X<S*>
' erklärt 'Freund'
Ist dies überhaupt nicht möglich oder gibt es eine Umgehungsmöglichkeit?
Der Grund, warum ich frage ist, dass ich einen Konstruktor in X<T*>
müssen, die diese Klasse von einem beliebigen X<S>
erzeugt (S
muss ein Subtyp von T
sein).
Der Code sieht wie folgt aus:
template <class T> class X<T*>{
T* t;
template<class S>
X(X<S> x) : t(&(x.t)) {} //Error, x.t is private
}
Nun wird der Compiler beschwert sich, natürlich, dass x.t
nicht visibile im Konstruktor ist, da es privat ist. Deshalb brauche ich eine Teilspezialisierungs-Freundklasse.
Ist eine 'get'-Funktion wirklich nicht in Frage? Das scheint mir viel sauberer zu sein und vermeidet den ganzen Wahnsinn der Template-Freunde. – pmr
würde es vielleicht in diesem Beispiel funktionieren. Es kann jedoch Daten geben, die nicht der Öffentlichkeit zugänglich gemacht werden sollten, sondern nur Vorlagenspezialisierungen. Die Frage ist, ob dieses Verhalten irgendwie möglich ist. – gexicide