Frage zu Template Klassen und der verflixten Linkerei
-
Hallo,
ich versuche mich gerade an der Implementierung von Template Klassen und bin dabei auf ein Problem beim Linken gestossen bei dem ich nicht mehr weiterkommen.
Im Prinzip habe ich 3 Klassen:
A-->B
|->CB und C sind private innerhalb von A definiert.
Jetzt müssen alle 3 Klassen auf eine Template Datenhalde zugreifen wobei ich dabei immer fleißig Pointer durchreiche.
Die Datenhalde ist dabei als Template Klasse definiert und A,B und C auch, da diese Funktionen implementieren die Datentyp abhängig sind.
Ich habe dazu mal ein Minimalbeispiel gepostet auf Github:
https://github.com/procrash/TemplateClassProblemSobald ich jetzt irgendwo eine Funktion der Datenhalde benutze stosse ich beim Linken auf ein Problem.
Ich weiß wie ich das ganze umschiffen könnte (indem ich ein Singleton für den Datentopf verwende) aber das möchte ich nicht, da die Sichtbarkeit des Singletons dann überall wäre.
Den Artikel hierzu habe ich auch schon durchgelesen und alles ausprobiert, komme aber mit den vorgeschlagenen Lösungsansätzen auch nicht weiter:
www.codeproject.com/Articles/48575/How-to-define-a-template-class-in-a-h-file-and-imp
Was könnte ich noch probieren? Wo könnte ich suchen?
-
Hi,
templates sollten in Headerdateien definiert werden.
VG Martin
-
Das weiß ich doch.
Laut dem Link den ich hier in der Frage gestellt habe gibt es mehrere Möglichkeiten trotzdem das ganze in Header und CPP File aufzuteilen.
Erste Möglichkeit: Im Header File includiert man das CPP File
Zweite Möglichkeite: Bei der Verwendung inkludiert man zusätzlich das CPP File
Dritte Möglichkeit: Man verwendet im Header File eine Funktion die die Template Klasse baut, somit soll der Compiler bereits vorher gezwungen werden dass Ding zu bauen. Die Funktion ruft man aber nie auf.Wie gesagt alles unschön und alles schon probiert, bekomme bei meinem Minimalbeispiel aber trotzdem noch nen Linker Fehler und habe keine Ahnung wieso.
-
Procrash schrieb:
Wie gesagt alles unschön und alles schon probiert, bekomme bei meinem Minimalbeispiel aber trotzdem noch nen Linker Fehler und habe keine Ahnung wieso.
Welchen Linkerfehler?
Benne eine CPP Datei um. Bei uns heißen sie xxx.inl
VG Martin
-
Der Compiler meckert dass er die Funktion der Datenhalde nicht linken kann.
Undefined symbols for architecture x86_64:
"DataStore<unsigned long long>::clearData()", referenced from:
B<unsigned long long>::() in main.o
C<unsigned long long>::() in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [MinimalCodeExampleTemplateClass] Error 1
17:57:44: Der Prozess "/usr/bin/make" wurde mit dem Rückgabewert 2 beendet.
Fehler beim Erstellen/Deployment des Projekts MinimalCodeExampleTemplateClass (Kit: Desktop Qt 5.7.0 clang 64bit)
Bei der Ausführung von Schritt "Make"
-
DataStore::clearData() ist weder im Header noch in der cpp implementiert.
-
nurso schrieb:
DataStore::clearData() ist weder im Header noch in der cpp implementiert.
verflucht. Da muss ich mein Minimalbeispiel nochmal überarbeiten. Irgendwo im Code ist bei mir noch der Wurm drin.
Ich poste mal ein update sobald ich das Beispiel zusammengestuzt habe