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 schreiben 🤡

    extern 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 😞


Anmelden zum Antworten