Templates mit Nested Classes - Compiler Error



  • Hallo,

    folgende Klassen-Beziehung:

    header:

    template <class S>
    class Class6 
    {
    
      class Subclass
      {
    
        // copy assignment operator
        Subclass& operator= (const Subclass& rhs);
      }
    }
    

    body:

    template<class S>
    Class6<S>::Subclass&
    Class6<S>::Subclass::operator= (const Subclass& rhs)
    {
      return *this;
    }
    

    ergibt folgenden Fehler:

    ../Class6.cpp:104: error: expected constructor, destructor, or type conversion before '&' token
    ../Class6.cpp:104: error: expected `;' before '&' token
    

    Ich benutze gcc 3.4.4 und habe das gleiche auch schon mit einem ms-compiler getestet. Scheinbar hat der Compiler ein Problem mit der Typaulösung des Class6<S>::Subclass&
    Auch ein

    typedef Class6<S>::Subclass&
    

    innerhalb der Subclass Deklaration will nicht gelingen.

    Hat da jemand eine Ahnung woran es hapert oder welchen workaound man benutzen kann?

    Danke



  • Klappt es denn, wenn du bei der Definition des Operators den kompletten Typ angibst?

    template<class S>
    Class6<S>::Subclass&
    Class6<S>::Subclass::operator= (const Class6<S>::Subclass& rhs)
    {
      return *this;
    }
    

    (und ein typedef kann man afaik nicht mit template-Parametern ausstatten)



  • eem schrieb:

    ergibt folgenden Fehler:

    ../Class6.cpp:104: error: expected constructor, destructor, or type conversion before '&' token
    ../Class6.cpp:104: error: expected `;' before '&' token
    

    *.cpp finde etwas seltsam
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39467.html



  • miller_m schrieb:

    eem schrieb:

    ergibt folgenden Fehler:

    ../Class6.cpp:104: error: expected constructor, destructor, or type conversion before '&' token
    ../Class6.cpp:104: error: expected `;' before '&' token
    

    *.cpp finde etwas seltsam
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39467.html

    das wär dann aber ein linker fehler 😉

    versuchs einfach mal so:

    template <class S>
    class Class6
    {
    
      class Subclass
      {
    
        // copy assignment operator
        Subclass& operator= (const Subclass& rhs);
      };// fehlendes;
    };//ebenso
    
    template<class S>
    typename Class6<S>::Subclass&//typename
    Class6<S>::Subclass::operator= (const Subclass& rhs)
    {
      return *this;
    }
    


  • otze schrieb:

    das wär dann aber ein linker fehler 😉

    stimmt auffällig :xmas1:



  • Hallo,

    Danke erstmal für eure Anteilnahme 🙂

    template<class S>
      Class6<S>::Subclass&
    ::Package1::Class6<S>::Subclass::operator= (const ::Package1::Class6<S>::Subclass& rhs){
      return *this;
      };
    

    die Schreibweise bringt nichts, weder im .cpp file, noch im header und führt zur gleichen Fehlermeldung.



  • //edit ich geb dem post mal doch nen sinn^^

    siehe meinen letzten post, da hab ich geedited



  • [quote="otze]
    versuchs einfach mal so:

    template <class S>
    class Class6
    {
    
      class Subclass
      {
    
        // copy assignment operator
        Subclass& operator= (const Subclass& rhs);
      };// fehlendes;
    };//ebenso
    
    template<class S>
    typename Class6<S>::Subclass&//typename
    Class6<S>::Subclass::operator= (const Subclass& rhs)
    {
      return *this;
    }
    

    [/quote]

    Herrvorragend. So macht der compiler alles wunderbar. Danke euch, ich werd mein neues Wissen gleich verbreiten 🙂

    Frohes Fest und so, gell?



  • //edit geht als Gast nicht.

    Aber seltsam ist es dennoch, dass dieses Problem nur beim coppy-ass-c'tor auftritt. default c'tor, default d'tor und copy-c'tor brauchen dieses typename nicht.
    Aber okay...



  • eem schrieb:

    default c'tor, default d'tor und copy-c'tor brauchen dieses typename nicht.

    Weil die Construktoren und der Destruktor keinen Rückgabetyp haben, den du mit einem expliziten "typename" kennzeichnen mußt. Wenn eine andere Funktion einen "Class6<S>::Subclass" zurückgeben will, brauchst du es wieder 😉



  • verstehe, danke.


Anmelden zum Antworten