Externe Klasse mit Templates -> "Nicht aufgelöstest Externes Symbol"



  • Hallo,
    ich habe ein kleines Problem mit einer extern definierten Klasse welche Templates nutzt. Ich verwende VC7, hier mal die Quelltexte:

    klasse.h

    template <class T>
    class klasse
    {
      void blub(T bla);
    };
    

    klasse.cpp

    #include "klasse.h"
    
    template <class T>
    void klasse<T>::blub(T blub)
    {
      //...
    }
    

    programm.cpp

    #include "klasse.h"
    
    int main()
    {
      klasse<int> testen;
      testen.blub(1);
      return 0;
    }
    

    Beim Compilieren / Linken kommt dann der folenden Fehler:

    "error LNK2019: Nicht aufgelöstes externes Symbol '"public: void __thiscall klasse<int>::blub(int)" (?blub@?$klasse@H@@QAEXH@Z)', verwiesen in Funktion '_main'"

    Ich kann den Fehler einfach nicht finden, im Prinzip ist ja nicht viel dran an dem Code, dass macht mich aber nur noch verrückter 😕.
    Ich wäre seeeeeeeehr dankbar für eure Hilfe...



  • Nabend,

    du kannst Template-Code nicht auf diese Art und Weise teilen. Template-Code wird
    dort instanziiert, wo er auftritt. Der Compiler schaut sich die Header an und
    erstellt eine entsprechende Klasse von einem Typ T. Das wars fuer den Compiler
    auch schon. Wenn du nun linkst, wird der Linker feststellen, dass er keine
    Definition des Codes finden kann und liefert dir die entsprechende Fehlermeldung.

    Du hast nun zwei Moeglichkeiten:

    1. Du schreibst den Code mit in die Headerdatei
    2. Du schreibst den Code in eine .cpp-Datei (oder wie auch immer du die nennen
      willst) und includierst diese an das Ende deiner Headerdatei.

    mfg
    v R



  • 1000 Dank für die Antwort, ich hatte den Code schon als Notlösung in den Header getan, aber das gefällt mir irgendwie garnicht ;), na was solls, wenns nicht anders geht...

    Aber wie funktioniert das eigentlich bei den Standard Librarys, z.B. bei vector, hier werden doch auch Templates genutzt und der Code wird doch wohl nicht in den Header Dateien stehen, oder 😕?



  • Na dann schau doch einfach mal in die Header. Dort findest Du tatsächlich die komplette Definition.

    Tommi



  • Hallo!

    Ich hab grad den Thread hier gefunden, weil ich ein ähnliches Problem hab. Allerdings nicht mit Templates. Von daher weiß ich nicht genau, inwieweit die Antworten auf mein Problem zutreffen.

    Folgendes: Ich muss im Rahmen eines Beleges im Studium ein Telefonbuch programmieren.

    /*Telefonbuchhead.h*/
    class person { … };
    
    class buch {
    private:
       person **p;
       unsigned int anz;
    
    public:
       buch();                         //Defaultkonstruktor belegt Member mit 0
       ~buch();
    
       //Methoden
       …
    
    };
    
    /*Telefonbuchfunc.cpp*/
    #include „Telefonbuchhead.h“
    …
    
    buch::buch(): p(0), anz(0ul){}       //Defaultkonstruktor
    buch::~buch(){…}                    //Destruktor
    

    Wenn ich den Destruktor, in der Klasse und damit in der Headerdatei definiere, funktioniert alles. Definiere ich dagegen den Destruktor in der .cpp Datei tritt folgender Fehler auf:

    Telefonbuch error LNK2019: Nicht aufgelöstes externes Symbol '"public: __thiscall buch::~buch(void)" (??1buch@@QAE@XZ)', verwiesen in Funktion '"public: void * __thiscall buch::`scalar deleting destructor'(unsigned int)" (??_Gbuch@@QAEPAXI@Z)'

    Wieso muss der Destruktor in diesem Fall in der .h definiert sein, bzw. wie kann ich den Fehler beseitigen und den Destruktor in der .cpp Datei definieren?

    Danke für die Antwort im Vorab!

    mfg
    Rodi



  • An sich stimmt alles - vielleicht wird einfach die .cpp-Datei nicht mitkompiliert?

    PS: Es gibt hier auch einen C++-Code Highlighter 😉



  • Doch, die .cpp Datei wird mitkompiliert, denn da habe ich ja noch eine ganze Menge anderen Code drin, der funktionier.

    Den c++ code Highlighter hab ich zuspät gesehen, war auch mein erster Beitrag hier im Forum! Aber ich editiers nochmal.

    Rodi


Anmelden zum Antworten