Template "Undefined reference"
-
Hallo zusammen,
bin grad etwas verwirrt und zwar geht es um folgendes kleines Test-Template Programm. Der Sinn des Programms ist jetzt nicht relevant nur wie die Templates arbeiten.Das hier funktioniert und mach alles wie ich es erwarte:
#include <iostream> #include <string> //- Declare template class template <class BasicPsiThermo, class MixtureType> class psiRhoThermo { public: //- constructor psiRhoThermo ( BasicPsiThermo&, MixtureType& ); //- destructor virtual ~psiRhoThermo(); }; //- Constructor template <class BasicPsiThermo, class MixtureType> psiRhoThermo<BasicPsiThermo, MixtureType>::psiRhoThermo ( BasicPsiThermo& a, MixtureType& b ) { std::cout << "psiRhoThermo constructor a: " << a << " b: " << b << std::endl; } //- Destructor template <class BasicPsiThermo, class MixtureType> psiRhoThermo<BasicPsiThermo, MixtureType>::~psiRhoThermo() {} //- int main() { //- Test stuff int a{1}; std::string myStr = "fooBar"; psiRhoThermo<int, std::string> object(a,myStr); return 0; }So weit so gut. Splitte ich jetz die Klasse in eine Header und Source File, bekomm ich den Fehler das mein Konstruktor und Destruktor nicht definiert sind "undefined reference to 'psiRhoThermo<int, std::string>::psiRhoThermo(int&, std::string&)'".
Das Programm sieht dnan wie folgt aus:
main.cpp
#include <iostream> #include <string> #include "psiRhoThermo.H" int main() { int a{1}; std::string myStr = "fooBar"; psiRhoThermo<int, std::string> object(a,myStr); return 0; }psiRhoThermo.H
#include <iostream> #include <string> #ifndef HERHOTHERMO_H #define HERHOTHERMO_H template <class BasicPsiThermo, class MixtureType> class psiRhoThermo { public: psiRhoThermo ( BasicPsiThermo&, MixtureType& ); virtual ~psiRhoThermo(); }; #endif // HERHOTHERMO_HpsiRhoThermo.C
#include "psiRhoThermo.H" template <class BasicPsiThermo, class MixtureType> psiRhoThermo<BasicPsiThermo, MixtureType>::psiRhoThermo ( BasicPsiThermo& a, MixtureType& b ) { std::cout << "psiRhoThermo constructor a: " << a << " b: " << b << std::endl; } template <class BasicPsiThermo, class MixtureType> psiRhoThermo<BasicPsiThermo, MixtureType>::~psiRhoThermo() {}Um mir sicher zu sein das ich da keinen Fehler gemacht hab, hab ich die Templates alle mal rausgeworfen und nur die Klasse (also keine Template-Klasse) angegeben. Damit funktioniert alles - ist ja auch ziemlich langweilig (:
Ich denkt das ich bei den Templates irgendwas noch falsch mache. Die Definition findet irgendwie nicht statt, bzw weiß der Compiler nicht wirklich wie das Template definiert ist. Dachte das ich das schon in der *.C Datei erledigt hatte.
Wäre sehr dankbar um eine kleine Erklärung. Hackel da schon etwas länger. Vielleicht mach ich auch grundlegende Dinge falsch...
Viele Grüße
Tobi
-
Hallo zusammen,
hmmm einfach nur dumm...
Nachdem ich den Beitrag verfasst hatte hab ich gleich die Antwort gefunden.
http://stackoverflow.com/questions/8752837/undefined-reference-to-template-class-constructorTschuldigt für die Thread Erstellung.
-
Kann das bitte jmd. mal kurz zusammenfassen auf was man beim arbeiten mit Templates bzw Headerfiles beachten soll, bzw. wie man vorgehen soll? Mein Englisch ist jetzt nicht soo der Hit und der Stackoverflow Artikel etwas..naja
-
-
Hey,
ich muss mich eigentlich schämen den gepinnten Thread zu übersehen. Danke für die Anmerkung. Wie ich gerade gesehen hab, sind in OpenFOAM alle Header Template Klassen am Ende mit folgendem versehen:
#ifdef NoRepository #include "SourceTemplate.C" #endifDas entspricht ja genau dem, das ich aus meinem Link und deinem Beitrag entnehmen konnte. Die Source-Dateien werden dann am Ende eingebunden. Folgende Frage stellt sich mir gerade. Für das oben genannte Konstrukt muss es ja irgendwo im Projekt eine Zeile geben, die das "noRepository" definiert:
#define NoRepositorySehe ich das richtig oder falsch? Wenn ich aber jetzt danach suche:
grep -rn -e "define NoReppository" *finde ich im ganzen Projekt allerdings kein einzigen Eintrag. Kann das sein?
Was mir gerade aufgefallen ist:
Die Kompilierung weißt als Flag folgendes auf:-DNoRepositoryIst das etwas ähnliches?
-
Die Antwort:
-> NoRepository wird als Flag dem Compiler zugewiesen und vordefiniert.
Ich brauch ne mütze Schlaf.
-
Danke Shor-ty für deine ausführlichen Beiträge hier, ich habe schon seit vielen Stunden nach deiner Lösung für dieses OpenFOAM-Compile-Problem gesucht!
-
Na immer gerne (:
-
Auch wenn es nett gemeint ist: Bitte keine uralten Threads pushen, besonders nicht, wenn man keinen fachlichen Beitrag zum Thread liefert. Für alle anderen Leser ist es nämlich nicht nett, wenn sie eine lange gelöste Fragestellung ganz oben im Forum finden.