Seite 1 von 1
C++ Templates .cpp/.h
Verfasst: 08.04.2009, 16:22
von Xethoras
So... Nach min. 2 Stunden Fehlersuche hab ich herausgefunden, dass Templates in C++ nicht in zwei Dateien gesplittet werden können, wie andere Klassen. Schade eigentlich. Nun wüsste ich gerne warum das so ist^^
Re: C++ Templates .cpp/.h
Verfasst: 08.04.2009, 16:29
von Aramis
Weil die Templates bei Verwendung vom Compiler instanziert werden müssen. Und dazu müssen alle instanzierenden Units Zugriff auf die vollständige Implementierung des Templates haben, die sich dann idealerweise im Header befindet.
Re: C++ Templates .cpp/.h
Verfasst: 08.04.2009, 16:31
von Xethoras
Versteh ich jetzt zwar zugegebenermaßen nicht ganz, aber trotzdem danke für die Antwort^^
Re: C++ Templates .cpp/.h
Verfasst: 08.04.2009, 16:57
von Schrompf
Was Aramis damit meint, ist: an der Stelle, an der Du das Template mit konkreten Parametern benutzt (sprich "instanziierst"), muss dem Compiler die komplette Implementation bekannt sein. Also nicht nur die Deklaration, also die Schnittstelle, wie sie üblicherweise in Headern steht, sondern auch die ganze Implementation, die man bei normalen Klassen ja in die .cpp-Datei schreibt.
Deine Optionen:
a) Implementier alles im Header
b) Implementier es in der separaten CPP-Datei und inkludiere die mit dazu.
c) Schreib die Implementation in eine eigene Datei... bei mir heißen die z.B. bla.inl (für inline)
Läuft alles auf's selbe hinaus: Du inkludierst die komplette Implementation, nicht nur die Deklaration.
Bye, Thomas
Re: C++ Templates .cpp/.h
Verfasst: 08.04.2009, 17:11
von Xethoras
Ok, mir bleibt wohl nix anderes übrig, als es zu aktzeptieren^^
hab alles in eine Datei gesteckt... am unkompliziertesten^^
Re: C++ Templates .cpp/.h
Verfasst: 08.04.2009, 18:43
von dowhilefor
Das mit *.inl ist gängige Praxis.
Was dir bestimmt daran nicht gefällt ist, das Leute genau deine Implementierung sehen können, wenn du bspw. deine Lib weitergibst. Guck dir mal boost oder die STL an und du wirst sehen, das Problem hast nicht nur du nur ... es macht nichts :)