Fehler bei Destruktor von template-Klasse
-
Hallo,
habe genauer gesagt ein Linker-Fehler der kommt.
Aber erst mal beschreiben was ich machen will:
Ich habe eine Template-Klasse (hier stark vereinfacht)template <class TKey, class TVal> class Klasse { public: Klasse(); Klasse(string _FileName); private: string FileName; }
Die Konstruktoren sehen so aus (die sind in eine separaten Datei):
template <class TKey, class TVal> Klasse<TKey, TVal>::Klasse() : FileName("") {}; template <class TKey, class TVal> Klasse<TKey, TVal>::Klasse(string _FileName) : FileName(_FileName) {};
Compilieren tut er alles.
Das Hauptprogramm ist lediglich das Standard Programm vom Studio, das einem vorgesetzt wird, wenn man mit nichtleerem visual c++ programm anfängt.
da füge ich dann als globale variable ein:Klasse <string, int> Instanz;
Wenn ich eine Instanz der Klasse in meinem Hauptprogramm hinzufüge dann zeigt er mir folgende Fehlermeldung:
Test1.obj : error LNK2019: unresolved external symbol "public: __thiscall Klasse<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int>::cOptions<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int>(void)" (??0?$cOptions@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@@QAE@XZ) referenced in function _$E1 Test1.obj : error LNK2019: unresolved external symbol "public: __thiscall Klasse<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int>::~cOptions<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int>(void)" (??1?$cOptions@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@@QAE@XZ) referenced in function _$E2 LIBCD.lib(wincrt0.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function _WinMainCRTStartup Debug/Test1.exe : fatal error LNK1120: 3 unresolved externals
Mal ein bißchen einfacher:
Test1.obj : error LNK2019: unresolved external symbol "public: __thiscall Klasse<string,int>::cOptions<string,int>(void)" referenced in function _$E1 Test1.obj : error LNK2019: unresolved external symbol "public: __thiscall Klasse<string,int>::~cOptions<string,int>(void)" referenced in function _$E2 LIBCD.lib(wincrt0.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function _WinMainCRTStartup Debug/Test1.exe : fatal error LNK1120: 3 unresolved externals
Weiß jemand was das bedeutet, ergo, was ich ändern muss
-
Ok, die Lösung ist eigentlich ganz billig:
einfach bei der Instanz im Hauptprogramm "extern" davor schreibenextern Klasse <string, int> Instanz;
und schon findet er alles und macht alles ...
na denn, ruhige Nacht allen...Edit:
also wenn ich der Instanz ein Argument mitgebe (den string) dann kommt das gleiche nochmal...
und wenn ich den string nicht übergebe linkt er wieder ordentlich
-
Fehler in Kernel32.dll schrieb:
Die Konstruktoren sehen so aus (die sind in eine separaten Datei):
Und das ist der Fehler - bei Template-Klassen benötigst du Definition UND Instantiierung an einer Stelle, um die konkrete Spezialisierung zu bekommen.
(sprich: wenn du die "Klasse.cpp" compilierst, hat dein Compiler keine Ahnung, für welche Parameter er Code bereitstellen soll; wenn du die "Main.cpp" compilierst, weiß er nicht, wie die Funktionen aussehen sollen)
-
aaahhhhhh....
vielen dank
ich wollte das ganze übersichtlicher machen... nich ganz so viel code in einer datei... schade