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 (); }; #endifKlasse.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.cppUnd 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
-
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