Problem mit Template: undefined reference



  • Ich wollte gerade eine Template-Klasse schreiben, aber schon gibt es ein Problem. Mein Beispielprogramm sieht folgendermaßen aus:

    Klasse.h:

    #ifndef KLASSE_H
    #define KLASSE_H
    
    template<class T>
    class Klasse
    {
    public:
    
    	Klasse ();
    };
    
    #endif
    

    Klasse.cpp:

    #include "Klasse.h"
    
    template<class T>
    Klasse<T>::Klasse ()
    {
    }
    

    main.cpp:

    #include "Klasse.h"
    
    int main ()
    {
    	Klasse<int> objekt;
    }
    

    Kompilert wird folgendermaßen:

    g++ -o Test main.cpp Klasse.cpp
    

    Und es erscheint der Fehler:

    main.cpp: undefined reference to `Klasse<int>::Klasse()'

    Wenn ich alles in eine Datei schreibe, funktioniert es. Aber so ist es ja nicht gedacht, denn bei normalen Klassen lagert man die Funktionen ja auch aus. Was mache ich also falsch?



  • Die haben das mit den Templates verkackt bzw. der Grund liegt in der etwas komplizierteren C++-Welt.

    Fakt ist: Du musst Templateklassen in der Header-Datei vollständig implementieren und kannst nichts in eine Source-Datei auslagern.

    MfG SideWinder



  • Das ist ja voll für'n Arsch. Ich kann doch nicht den gesamten Quellcode in die Header-Datei packen. Wie sieht denn das aus?
    Was macht man da eigentlich, wenn man seinen Quellcode zum Beispiel nicht veröffentlichen will, sondern der Nutzer nur eine Header- und eine Lib-Datei haben soll?



  • Dann machst du es wie die dummen Dinkumware-Implementierer und gibst allen deinen Variablen möglichst kryptische Namen 🤡

    Nein, du hast da keine Chance. Als einziger Compiler unterstützt Comeau ein export, wobei das afair auch nicht des Rätsels wirkliche Lösung ist...

    Aber siehs doch positiv, Header/Source-Aufteilung ist doch sowieso sowas von out heutzutage und nur noch bei altmodischen Sprachen der Fall *g*

    Add: Eine richtig schöne Interface/Implementation-Trennung ist das ja sowieso nie gewesen. Ich mein, wenn der Benutzer schon die in der Klasse verwendeten Variablen sehen kann er auch sehr leicht auf die Implementierung schließen...

    MfG SideWinder


  • Mod

    Kann man so sehen. Andererseits ist ein Template keine Klasse. Verschiedene Dinge verhalten sich gelegentlich auch verschieden. So auch hier:

    SideWinder schrieb:

    Die haben das mit den Templates verkackt bzw. der Grund liegt in der etwas komplizierteren C++-Welt.

    Fakt ist: Du musst Templateklassen in der Header-Datei vollständig implementieren und kannst nichts in eine Source-Datei auslagern.

    MfG SideWinder

    Denn es ist gerade das Klassentemplate und nicht die Templateklasse, dessen Definition sichtbar sein muss.



  • Der Unterschied ist:

    template<class T>
    class MyClass
    ...
    
    und
    
    typedef MyClass<int> MyClassInt;
    

    ? Wenn ja, gut, schön, ändert aber nichts daran, dass das Konzept Mist ist 😉

    MfG SideWinder


Anmelden zum Antworten