Problem mit Template-Klasse
-
Hallo,
mein Problem ist,dass ich kein Objekt von meiner Template-Klasse erzeugen kann, von meiner normalen Klasse aber schon,obwohl beide Klassen in der gleichen Header-Datei deklariert und in der gleichen cpp-Datei definiert sind. Woran liegt das?Danke
Header.h
class Klasse { public: Klasse(void); }; template <typename T> class TKlasse { public: TKlasse(void); };Code.cpp
#include "Header.h" Klasse::Klasse(void) { //... }; template <typename T> TKlasse<T>::TKlasse(void) { //... };Main.cpp
#include "Header.h" void main() { Klasse Obj1; // macht keine Probleme TKlasse<int> Obj2; // ist dem Compiler nicht bekannt };
-
Tenmplate-Definition müssen in den Header-Dateien definiert sein (direkt oder indirekt per #include eingebunden).
Der Compiler muß die Definitionen schon kennen, nicht erst der Linker (nur ein Compiler unterstützt das Schlüsselwort "export").
-
~template schrieb:
Der Compiler muß die Definitionen schon kennen, nicht erst der Linker (nur ein Compiler unterstützt das Schlüsselwort "export").
Und selbst dann muss der Compiler die Definitionen kennen, nicht erst der Linker
-
Nein, gerade dafür ist ja das Schlüsselwort "export" gedacht gewesen.
Jedoch ist die Umsetzung so schwierig, daß bisher nur der Comeau-Compiler (bzw. dessen Linker!) damit umgehen kann (und es wird wohl auch der einzige bleiben).
-
Wie wird das eigentlich gemacht? Wird der Code beim Linken nochmal nachkompiliert? Schließlich muss der Linker ja herausfinden, von wo und mit welchen Typen das Template instantiiert wird und entsprechende Code-Instanzen erstellen. Im Prinzip ja also "nochmal kompilieren". Oder nicht? Und der Aufbau von Libs ist Compiler-Sache, liege ich da richtig?
-
s. z.B. http://www.comeaucomputing.com/4.0/docs/userman/export.html
Es wird quasi eine Art Zwischen-Unit erzeugt, in der dann die Template-Definitionen drinsstehen.
-
genau deshalb müssen für diese Zwischenunit beim "prelinking" die Definitionen vorhanden sein. Auf der von dir verlinkten Seite stehts:
The ". et" files only inform Comeau C++ about the location of exported template definitions; they do not actually contain those definitions. The sources containing the exported template definitions must therefore be made available at the time of instantiation (usually, when prelinking is done). This is simply done as per the example above. Note that the export facility is not a mechanism for avoiding the publication of template definitions in source form.
Mal abgesehn davon dass es dadurch immer noch kein portabler Code ist, wenns nur ein Compiler kann.