Eigene Templateklasse schreiben

  • Geg. sind folgende Dateien:

    und die daraus resultierende Fehlerausgabe

    Mach ich die Implementierung 'inline' und geb alles in eine Datei, funktioniert alles:

    "Von der Gewalt, die alle Wesen bindet, befreit der Mensch sich, der sich überwindet." > Learn more ...

  • Wenn's in einem File funktioniert, klingt das auf den ersten Blick nach folgendem Problem:
    Der C++ Compiler übersetzt die Templates statisch, das heißt beim Kompilieren wird geschaut mit welchen Typen du die Templateklasse verwendest und für jeden Typ wird eigener Code übersetzt. Wenn du den Templatecode jetzt aufteilst und als eigenes Object File kompilieren möchtest, weiß der Compiler nicht, welche Typen hier eingesetzt gehören und kann für keine Code erzeugen.
    Den ganzen Templatecode musst du deswegen in einem Headerfile lassen. Erst beim Übersetzen ins eigentliche Programm, wird der Code dann kompiliert für die entsprechenden Typen.
    Hoffe, das war halbwegs richtig erklärt und ist der Fehler, klingt aber irgendwie danach... und wenn nicht, findet sich eh sicher jemand, der mich steinigt :)

  • Wird ein generischer Typ nicht inline verwendet, sondern außerhalb der Klassendefinition verwendet, muss man immer template<typename T> (analog zur Klassendeklaration) voranstellen. Die Klasse selbst muss incl. Templateparameter angegeben werden, ein Beispiel:

    Code
    template <typename T>
    struct Stack {
     T& pop();
    };
    
    
    template <typename T>
    T& Stack<T>::pop() { ....}

    Dipper dipper dii dipper dii dipper dii duuu

  • ok, danke einmal!
    Auf die Art kompiliert dann auch 'Personenverwaltung.cpp'.

    Allerdings erhalte ich folgende Fehler beim Linken:

    Code
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: class Person __thiscall Personenverwaltung<class Person>::get(int)" (?get@?$Personenverwaltung@VPerson@@@@QAE?AVPerson@@H@Z)" in Funktion "_main".
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: int __thiscall Personenverwaltung<class Person>::compare(class Person,int)" (?compare@?$Personenverwaltung@VPerson@@@@QAEHVPerson@@H@Z)" in Funktion "_main".
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: bool __thiscall Personenverwaltung<class Person>::isSorted(void)" (?isSorted@?$Personenverwaltung@VPerson@@@@QAE_NXZ)" in Funktion "_main".
    Template2.exe : fatal error LNK1120: 3 nicht aufgelöste externe Verweise.

    Lösch ich nur die drei 'cout'-Anweisungen mit den
    Methodenzugriffen, so funktioniert alles einwandfrei

    "Von der Gewalt, die alle Wesen bindet, befreit der Mensch sich, der sich überwindet." > Learn more ...

  • Personenverwaltung.cpp müsste eigentlich leer sein. Du musst die Definitionen der methoden ebenso ins .h file ziehen. Den Grund hat gelbasack schon erklärt. Ich nehme mal an du stehst jetzt vor diesem Problem (wirkt sich immer nur auf linken aus).

    Theoretisch gäbe es noch 2 möglichkeiten das ganze im .cpp zu lassen:
    a) explizite instanzierung:

    du fügst im Personenverwaltung.cpp noch folgendes ein (Person muss natürlich bekannt sein ...):

    template class Personenverwaltung<Person>;

    b) das keyword export

    dies ist im c++-standard enthalten und "löst" genau dieses problem - es ist aber das einzige c++-feature, dass kein gängiger compiler unterstützt (aus gutem grund) - daher forget it :)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!