Compiler-Probleme bei Template-Classe und stl list



  • Hi,

    ich versuche gerade den Compiler dazu zu bewegen, mir eine Template-Klasse zu compilieren. Leider ohne Erfolg. Folgender Codeschnipsel produziert bereits einen Fehler, wenn die dargestellte Klasse versucht wird zu verwenden:

    template<class T> class CPolyLine
    {
    private:
        std::list<T> m_items;
    // ...
    };
    
    // ...
    
    // MyClass.cpp:
    void MyClass::MyMethod()
    {
        CPolyLine<const Point> line(/*constructor params*/);
        // ...
    }
    

    Der Fehler lautet:

    D:\Programme\Microsoft Visual Studio .NET\Vc7\include\xmemory(87) : error C2535: 'std::allocator<_Ty>::pointer std::allocator<_Ty>::address(std::allocator<_Ty>::reference) const' : Memberfunktion bereits definiert oder deklariert
            with
            [
                _Ty=const CPoint
            ]
            D:\Programme\Microsoft Visual Studio .NET\Vc7\include\xmemory(81) : Siehe Deklaration von 'std::allocator<_Ty>::address'
            with
            [
                _Ty=const CPoint
            ]
            D:\Programme\Microsoft Visual Studio .NET\Vc7\include\list(23) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::allocator<_Ty>'
            with
            [
                _Ty=const CPoint
            ]
            D:\Programme\Microsoft Visual Studio .NET\Vc7\include\list(51) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::_List_nod<_Ty,_Alloc>'
            with
            [
                _Ty=const CPoint,
                _Alloc=std::allocator<const CPoint>
            ]
            D:\Programme\Microsoft Visual Studio .NET\Vc7\include\list(71) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::_List_ptr<_Ty,_Alloc>'
            with
            [
                _Ty=const CPoint,
                _Alloc=std::allocator<const CPoint>
            ]
            D:\Programme\Microsoft Visual Studio .NET\Vc7\include\list(88) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::_List_val<_Ty,_Alloc>'
            with
            [
                _Ty=const CPoint,
                _Alloc=std::allocator<const CPoint>
            ]
            e:\Develop\3D_Manke\include\Util\PolyLine.h(24) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::list<_Ty,_Ax>'
            with
            [
                _Ty=const CPoint,
                _Ax=std::allocator<const CPoint>
            ]
            source\ToothClassification\MyClass.cpp(49) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'CPolyLine<T>'
            with
            [
                T=const CPoint
            ]
    

    Warum nur?? Liegt das daran, dass ich die Liste mit dem Template-Typen 'T' initialisiere? Leider finde ich den Compiler nicht sehr hilfreich, wenn es um Templates/STL geht...

    Grüße,
    Felix



  • Auch wenn die Fehlermeldungen darauf überhaupt nicht hindeuten, geht es zufällig wenn Du line als CPolyline<Point>, also ohne const definierst?



  • Ja... (*wunder*)



  • Ich denke ich kann Dir das erklären (wenngleich die Meldungen echt schlüssiger sein könnten):

    Wenn ein neues Objekt in die Liste eingefügt wird, z.B. per push_back, wird das Element was Du übergibst in die Liste kopiert. Ist ja auch klar, denn das Element Point liegt wenn Du es einfügst höchstwahrscheinlich auf dem Stack, die Liste allokiert ihre Elemente aber auf dem Heap. Nur, kann man eine Konstante nur initialisieren, niemals kopieren (ist ja konstant). Und das stört ihn hier.



  • Ah, alles klar. Naja, ich habe nun CPolyLine<const Point*> verwendet. Ist sowieso logischer, da ich meine Punkte, die ich einfüge, auch auf dem Heap habe und sie als Pointer vorliegen. Und -- um zu testen, ob ich die Erklärung verstanden habe -- damit klappt es, da der Pointer nicht const ist. Ergo sollte es mit CPolyLine<const Point *const> auch nicht klappen, gelle?

    Trotzdem vielen Dank, ich werde mich beim nächsten Mal vielleicht dran erinnern 🙂


Anmelden zum Antworten