PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++: Linkerprobleme mit Template


Gast
2007-04-11, 19:19:45
Folgendes Problem habe ich mit einer (statischen) Template Klassenmethode:

Header Datei:

class Editor
{
public:
template<class c> static void openInEditor();
[..]
};

dazugehörige cpp Datei:

template<class c> void Editor::openInEditor()
{
Editor* ed = new c();
[...]
}

eine weitere cpp Datei, welche den oben genannten Header einbindet, ruft folgendes auf:
Editor::openInEditor<IslandEditor>();

Kompilieren klappt, aber dann kommt ein Linkerfehler:

MainEditorWindow.cpp:(.text+0x136): undefined reference to `void Editor::openInEditor<IslandEditor>()'
collect2: ld gab 1 als Ende-Status zurück


Compiler ist gcc 4.1.

Gast
2007-04-11, 19:41:59
Enteweder Template für jeden benötigten Typ explizit instanzieren, oder die Implementierung in die Headerdatei packen, so dass der Compiler die benötigten Instanzen des Templates selber erstellen kann.

Coda
2007-04-11, 20:13:10
Templates sollten grundsätzlich im Header deklariert werden.

export wird von keinem vernünftigen Compiler unterstützt, und wenn dann würde es eh nichts helfen, weil die zugehörige cpp-Datei trotzdem pro Übersetzungseinheit angeschaut werden müsste.

Gast
2007-04-11, 20:24:16
Enteweder Template für jeden benötigten Typ explizit instanzieren
Wie genau funktioniert das?

Templates sollten grundsätzlich im Header deklariert werden.
Meinst du wirklich "deklariert", oder doch eher "definiert"?

PH4Real
2007-04-11, 23:46:47
Wie genau funktioniert das?

In die Header Datei am Schluss:

template class Editor<IslandEditor>;

Dies ist die eine Variante, falls das Template nur in dieser Form vorkommt.

Meinst du wirklich "deklariert", oder doch eher "definiert"?
Ansonsten dein Template komplett in die Header Datei, da wie schon gesagt, so gut wie kein Compiler bisher das Exportieren von Templates unterstützt, so dass Du diese nicht in .h und .cpp trennen kannst.

Coda
2007-04-12, 01:38:22
Meinst du wirklich "deklariert", oder doch eher "definiert"?
Definiert. Sorry, brainfart...

...so gut wie kein Compiler bisher das Exportieren von Templates unterstützt...
Das wird im nächsten C++-Standard wohl eh rausgenommen. Es ist einfach sinnlos.

Gast
2007-04-12, 12:55:52
Ok, Danke an alle :)