[C++] Template-Fkt / LNK2019

Legenbaer

Cadet 4th Year
Registriert
Juni 2006
Beiträge
108
Hallo Leute,

mal wieder sitze ich an einem LNK2019 Fehler der langsam wirklich nervt.
Beschreibung:

Ich habe eine Template Funktion in einem Header deklariert und der Rumpf in einer CPP Datei implementiert. Wenn ich nun jedoch versuche die Funktion von einer anderen Quellcodedatei aus aufzurufen, dann bekomme ich immer einen LNK2019 Fehler. Wenn ich jedoch den Rumpf in die Headerdatei kopiere kann ich die Datei auch ohne Probleme aufrufen. Ich hab schon alles mögliche kontrolliert (Rechtschreibfehler, richtiger Namespace, includierung) aber bisher ohne Erfolg.

Habt ihr ne Idee?

Danke im Vorraus ;)

MfG

Edit:

Ich habe gerade gelesen, dass man Template-Klassen nicht in .h und .cpp aufteilt. Kann ich daraus nu schließen, dass es für Funktionen auch gilt und das das Ende der Geschichte ist?

Ja es ist das Ende...denn Template Funktionen werden als ganzes programmiert und nicht aufgeteilt.
 
Zuletzt bearbeitet:
Hi,

ja dein letzter Schluss ist genau richtig. Das geht einfach nicht.

Das liegt daran, dass das Template erstmal für den Compiler "nichts" ist und er es auch nur rudimentär syntaktisch prüfen kann.

Erst wenn dieses Template irgendwo instanziiert wird, erzeugt der Compiler tatsächlich Code. Wenn er nun aber die Definition (also die Implementierung) des Templates nicht "sehen" kann, weil sie in einer .cpp Datei steht, so erzeugt er nur die konkrete Deklaration, aber nicht die Definition des Templates, wodurch der von dir genannte Linkerfehler entsteht. Das ist das gleiche als würdesst du eine Forward-Deklaration auf eine Funktion hinschreiben, aber sie nicht implementieren.

Es gibt zwar theoretisch eine Lösung für das Problem, und zwar mit dem Schlüsselwort export. Dieses Schlüsselwort ist allerdings stark unterspezifiziert, so dass es bis auf den Comeau-Compiler niemand unterstützt. Und selbst der Comeau-Compiler implementiert nur ein "mögliches" Verhalten, ein anderer Compiler-Hersteller könnte es anders implementieren mit anderem Verhalten. Außerdem gefährdet dieses Schlüsselwort die Semantik der Sprache bzw. kann diese verändern. Es ist wohl davon auszugehen, dass es früher oder später wieder aus dem Standard entfernt wird.

Es gibt auch noch eine Variante, die Implementierung eines Templates zu isolieren, und zwar über explizite Instantiierung. Das kann man dann benutzen, wenn das Template nur für einige wenige Typen verwendet wird, die bei Erstellung des Templates sowieso schon bekannt sind. Falls du glaubst, dass das für dich interessant sein könnte, schau dich mal nach expliziter Instantiierung (respektive explicit instantiation) um. Das bringt allerdings im wesentlichen nur Einschränkungen mit sich.

Letztenendes, willst du trotzdem die Definition von der Deklaration des Templates trennen, so erstell dir eine .hpp-Datei, in die du die Definition packst. Am Ende des Headers, in dem du das Template deklarierst, inkludierst du dann die .hpp-Datei.

Gruß
 

Ähnliche Themen

Zurück
Oben