undefined reference to...



  • hab mal wieder n Problem mit ner undefiened reference und zwar ist die Aufgabe einen SparseVector in eine Template Klasse umzuschreiben. Soweit so gut. das kompilieren des SparseVectors und des Testprogramms laufen durch beim linken erhalte ich aber massenweise undefined references die entweder auf den constructor, den copy-constructor oder auf den destructor verweisen:
    "undefined reference to 'SparseVector<int>::~SparseVector()'"

    /* DESTRUCTOR */
      ~SparseVector();  // destructor; frees allocated nodes
    

    der Destrcutor im Header
    und im cc-file ist folgendes

    template <class T>
    SparseVector<T>::~SparseVector() {
      clear();
    }
    

    kann mir jemand erklären wieso ich da ne undefined Reference bekomme? oder muss ich den ganzen kram in meinen Header schreiben?



  • template --> alles in den header



  • heißt das, dass ich wirklich alles in den header schreiben muss? dachte bislang, dass nur funktionen die eine class T übergeben bekommen oder diese zurückgeben in den Header kommen?!



  • Rocko105 schrieb:

    heißt das, dass ich wirklich alles in den header schreiben muss? dachte bislang, dass nur funktionen die eine class T übergeben bekommen oder diese zurückgeben in den Header kommen?!

    Templates müssen immer komplett definiert sein. Alternativ gibt es 2 weitere Varianten die aber beide Probleme haben:
    a) Die eine Variante kann bislang soviel ich weiß nur der Comeau C++ Compiler (Templateexport)
    b) Man includiert nicht den Header sondern die C++ - Imho eine sehr unschöne Sache da sehr gewöhnungsbedüftig

    cu André



  • brauch ich denn dann überhaupt n SourceFile? Das würde dann ja völlig wegfallen?!



  • Rocko105 schrieb:

    brauch ich denn dann überhaupt n SourceFile? Das würde dann ja völlig wegfallen?!

    Nein, in der Regel arbeitet man bei Templates ausschließlich mit Headern.



  • dann versteh ich nicht, warum unser Prof das cc file haben will..naja jetzt läuft es auch 🙂 *freu*



  • Der eine oder andere macht es so, dass er im Header zuerst ein ganz normale KLassendefinition macht bei der die Methoden lediglich deklariert werden, wie bei normalen klassen auch. Da beim KLassentemplate aber die definition der methoden mitgeliefert werden muss, includiert man diese am Ende des Headers - ob die dann .cc oder .tpl oder wie auch immer heißt ist dem Einzelnen überlassen.

    //X.h
    
    template <class T>
    class X {
    public:
      void foo(); //deklaration
    };
    
    #include "X.tpl" //definitionen einbinden
    
    //X.tpl
    template <class T>
    void X<T>::foo() {/*...*/}
    


  • asc schrieb:

    a) Die eine Variante kann bislang soviel ich weiß nur der Comeau C++ Compiler (Templateexport)

    IMO kann das der neue Borland/Codegear Compiler mittlerweile auch



  • In der Hilfe zum BCB2007 steht, dass export noch nicht implementiert sei. Ich werde es am besten mal ausprobieren.
    [edit]
    Nun habe ich es getestet. Es ist wie die Hilfe sagt, noch nicht implementiert. Beim Linken kommt eine undefined reference.
    [edit]


Anmelden zum Antworten