Ergebnis 1 bis 5 von 5

Nicht aufgelöstes externes Symbol (Templatefunktion, C++)

  1. #1 Zitieren
    Deus Avatar von Daepilin
    Registriert seit
    Oct 2006
    Ort
    NRW
    Beiträge
    11.619
    Hio, hab n problem und find es grad einfach nicht :/
    (sprache ist c++)

    es geht um folgende templatefunktion:
    die cpp:
    Code:
    template<class T>
    T* ReadBinaryFile(std::string FilePath){
    	T* TmpObject = NULL;
    
    	std::ifstream read(FilePath, std::ios::binary);
    	if(read){
    		TmpObject = new T();
    		read.read((char*) TmpObject, sizeof(T));
    		read.close();
    	}
    	else{
    		std::cout << "Error Loading File: " << FilePath << std::endl;
    	}
    
    	return TmpObject;
    }
    hpp:
    Code:
    template<class T>
    T* ReadBinaryFile(std::string FilePath);
    aufruf(mMainSettings ist ein Pointer auf Settings, die .bin datei existiert nicht, aber das soltle doch eig die if abfrage in der einlesefunktion abfangen?):
    Code:
    if(ReadBinaryFile<Settings>("Save/Settings/Settings.bin") != NULL) mMainSettings->operator=(ReadBinaryFile<Settings>("Save/Settings/Settings.bin"));
    fehler:
    Verweis auf nicht aufgelöstes externes Symbol ""class Settings * __cdecl ReadBinaryFile<class Settings>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??$ReadBinaryFile@VSettings@@@@YAPAVSettings@@V?$basic_string@DU?$char_traits@D @std@@V?$allocator@D@2@@std@@@Z)" in Funktion ""private: void __thiscall Framework::LoadSettings(void)" (?LoadSettings@Framework@@AAEXXZ)".



    e: habs, bitte nich lachen an die dies wissen... wusste nichmehr, dass templatefunktionen nicht in hpp und cpp gesplitet werden können 8auf diese weise zuminest)
    Seh da grad vrmtl. den wald vor lauter bäumen nicht :/

    Daepilin ist offline Geändert von Daepilin (23.06.2013 um 12:41 Uhr)

  2. #2 Zitieren
    Ritter Avatar von Delta 38
    Registriert seit
    Nov 2008
    Ort
    Bremen
    Beiträge
    1.251
    Pack doch einfach die Methoden-Definition mit in die Header-Datei
    Delta 38 ist offline

  3. #3 Zitieren
    Ritter Avatar von ojas
    Registriert seit
    Jun 2008
    Ort
    Erde
    Beiträge
    1.787
    Zitat Zitat von Daepilin Beitrag anzeigen
    ... wusste nichmehr, dass templatefunktionen nicht in hpp und cpp gesplitet werden können ...
    Genauer gesagt, Templates müssen in der Übersetzungseinheit definiert sein, in der sie verwendet werden. Das was du Templatefunktionen nennst sind eben keine Funktionen, sondern in erster Linie Templates. Der C++ Compiler strickt daraus Funktionen. Das kann er aber nur machen, wenn er weiß, wie er die Templateparameter durch die Argumente ersetzen soll. Dazu braucht er die Definition des Templates, nicht nur die Deklaration.

    Um diesen Zusammenhang etwas deutlicher zu machen spricht man auch eher von Klassentemplates und Funktionstemplates, als von Templateklassen und Templatefunktionen.

    Und natürlich wäre C++ nicht C++, wenn man da nicht etwas herumdoktoren könnte:

    foo.h:
    Code:
    template<class T> void foo(T);
    foo.cpp:
    Code:
    #include <iostream>
    #include "foo.h"
    
    template<class T> void foo(T t) { std::cout << t; }
    
    template void foo<int>(int t);
    main.cpp:
    Code:
    #include "foo.h"
    
    extern template void foo<int>(int);
    
    int main() {
      foo(5);
    }
    Kompiliert einwandfrei, ohne dass die Implementierungsdetails des Funktionstemplates foo in main bekannt sind. Das bezahlt man aber damit, dass die Datei foo.cpp mit der Templatedefinition nun selbst mittels template void foo<int>(int t) dafür sorgen, dass eine Templateinstanziierung mit T=int zur Verfügung steht. Das nennt man dann explizite Templateinstanziierung. Die ist nützlich, wenn man schon im Vorfeld weiß welche Templateinstanziierung gebraucht werden und dass man weitere nicht zulassen möchte.
    ojas ist offline Geändert von ojas (23.06.2013 um 16:25 Uhr)

  4. #4 Zitieren
    Deus Avatar von Daepilin
    Registriert seit
    Oct 2006
    Ort
    NRW
    Beiträge
    11.619
    Zitat Zitat von Delta 38 Beitrag anzeigen
    Pack doch einfach die Methoden-Definition mit in die Header-Datei
    hab ich jetzt ja auch gemacht


    Zitat Zitat von ojas Beitrag anzeigen
    Genauer gesagt, Templates müssen in der Übersetzungseinheit definiert sein, in der sie verwendet werden. Das was du Templatefunktionen nennst sind eben keine Funktionen, sondern in erster Linie Templates. Der C++ Compiler strikt daraus Funktionen. Das kann er aber nur machen, wenn er weiß, wie er die Templateparameter durch die Argumente ersetzen soll. Dazu braucht er die Definition des Templates, nicht nur die Deklaration.

    Um diesen Zusammenhang etwas deutlicher zu machen spricht man auch eher von Klassentemplates und Funktionstemplates, als von Templateklassen und Templatefunktionen.
    Danke für die ausführlichere Erklärung (Kam in der C++ Vorlesugn auch sicher mal dran, hatte es nur vergessen :/)

    Daepilin ist offline

  5. #5 Zitieren
    Abenteurer
    Registriert seit
    Aug 2005
    Beiträge
    75
    Üblicherweise haut man die Definition in eine weitere Datei (.inl, .cpp, ..) und bindet die einfach am Ende ein. Ist alle mal übersichtlicher als alles direkt in die Header zu packen. ;-)
    Scr33D ist offline

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •