Seltsames Compiler/Linker Problem
-
Hallo,
ich habe folgendes Problem. Ich habe eine Header-Datei (sequence.h), in der einige Klassen definiert werden, und eine dazugehörige CPP-Datei (sequence.cpp), in der die Definition von drei Funktionen der Klassen erfolgt. Nun habe ich noch eine weitere CPP-Datei, die etwas mit den Klassen herumspielt, um sie zu testen (test.cpp). Zum Kompilieren verwende ich (unter Linux) einfach den Befehl
g++ sequence.cpp test.cppIst doch eigentlich alles richtig? Trotzdem beschwert sich der Linker, er könne einige Definitionen (genau die, die in sequence.cpp liegen) nicht finden. Hier mal der Quelltext der drei Dateien:
http://home.arcor.de/phate_tg/sequence.h
http://home.arcor.de/phate_tg/sequence.cpp
http://home.arcor.de/phate_tg/test.cpptest.cpp:(.text+0xb6): undefined reference to `ISequenceReader<float>::operator[](unsigned int)'Vielen Dank im Voraus!
-
Das ist ein Template - Problem

Der Compiler, der sequence.cpp compiliert weiß nicht dass er ISequenceReader<flaot> braucht und erstellt es daher nicht und in test.cpp hat der compiler keine Möglichkeit ISequenceReader<float> zu erstellen.
Da gibt's mehrere Lösungswege:
- Du gibst alles aus sequence.cpp auch in die .hpp als inline klassenfunktionen
- Du verwendest export und einen Compiler der das kann (g++ kanns nicht)
- Du sagst dem Compiler in sequence.cpp explizit dass du die Version für float gerne hättest
-
Danke für deine Antwort! Also Lösung 1 scheint mir ja noch am flexibelsten zu sein. Aber mal eine Frage, angenommen ich verwende nicht g++, wie sähe denn die Lösung mit "export" aus?
-
In diesem Fall musst du den Comeau Compiler verwenden (IMO macht's auch ein neuer Borland Compiler) und einfach im Header vor das template ein export schreiben.
Ist aber nur von /sehr/ begrenztem Nutzen

EDIT://
Und ich kann für nichts garantieren, ich Verwende primär G++ und sekundär MS VC8 und die können beide kein export