Problem bei Verschachtelten Template Klassen
-
template<typename S> struct A { template<typename T> class B; }; template<typename S> template<typename T> class A<S>::B { class C; }; template<typename S> template<typename T> class A<S>::B<T>::C { C& GibReferenz(void); }; template<typename T> template<typename S> A<S>::B<T>::C& // <= Rückgabetyp A<S>::B<T>::C::GibReferenz(void) { return *this; }Hallo ich bekomme bei obigem Coden folgen Fehler,wenn ich GibReferenz definieren möchte:
error: expected constructor, destructor, or type conversion before '<' tokenWo liegt der Fehler?
Vielen Dank im Vorraus
-
template<typename S> template<typename T> typename A<S>::template B<T>::C& // <= Rückgabetyp A<S>::template B<T>::C::GibReferenz(void) { return *this; }
-
Es sind Klassentemplates.
-
Danke!
Darf ich noch um eine Erklärung bitten?
-
Sorry hab den Post übersehen. Alles klar

-
Jemand___ schrieb:
Danke!
Darf ich noch um eine Erklärung bitten?Da A<S>::B<T>::C von den Templateparametern T und S abhangt, steht zu der Zeit wenn der Compiler das erste Mal über das Template geht nicht fest, was A<S>::B<T>::C überhaupt ist. Das könnte ja nicht nur ein Typ sein, sondern zum Beispiel auch ein statischer Member von A<S>::B<T> oder selber ein Template. Damit der Compiler die Richtigkeit des Codes prüfen kann und damit hinterher geprüft werden kann, ob das was A<S>::B<T>::C ist (wenn S und T erst einmal feststehen) auch passt, muss dem Compiler mitgeteilt werden, dass A<S>::B<T>::C ein Typenname sein soll. Das macht man mit dem typename Schlüsselwort.
Siehe auch hier für die gleiche Erklärung in lang:
http://pages.cs.wisc.edu/~driscoll/typename.htmlSeltener braucht man auch noch ein explizites "template" im gleichen Sinne, um eben ersichtlich zu machen, dass etwas, was von einem Templateparameter abhängt selber wieder ein Template ist.