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 '<' token

    Wo liegt der Fehler?

    Vielen Dank im Vorraus


  • Mod

    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 👍


  • Mod

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

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


Anmelden zum Antworten