Klassen-Template mit Konstruktor
-
Liebe Leut, folgendes Problem: Klassen-Template aufgeteilt auf eine .h- und eine .cpp-Datei verursacht einen Linker-Fehler.
gemb.h:template <typename T> class gemb { public: gemb(); };
gemb.cpp:
#include <iostream> #include "gemb.h" template<typename T> gemb<T>::gemb() { std::cout << "Hello World!"; }
main.cpp:
#include <iostream> #include "gemb.h" template<typename T> gemb<T>::gemb() { std::cout << "Hello World!"; }
Es wird mit C++11 kompiliert. Der Fehler lautet
undefined reference to 'gemb<int>::gemb()'
. Hat hier wer ne Ahnung oder einen Tipp wie ich das lösen kann?
Danke J
-
@Jim-Knopf
Ja, implementier´ alles im Header.
-
Siehe auch: https://isocpp.org/wiki/faq/templates#templates-defn-vs-decl und/oder https://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file
-
Dieser Beitrag wurde gelöscht!
-
@wob und DocShoe
Ach das soll gar nicht so sein ...
Hab ich nicht kapiert, dass templates immer nur in Header implementiert werden müssen,
Danke für Eure prompte Antwort
-
@Jim-Knopf sagte in Klassen-Template mit Konstruktor:
@wob und DocShoe
Hab ich nicht kapiert, dass templates immer nur in Header implementiert werden müssen,Lies die Links genauer durch. Du kannst auch die Trennung aufrecht halten, musst dann aber jeden Typ, den du in dein Template einsetzt, explizit auflisten.
Am prägendsten finde ich aus dem SO-Link den Satz "a template is literally a template; a class template is not a class, it's a recipe for creating a new class for each T we encounter".
Ansonsten ist aber allgemein bei Templates (und NUR bei Templates) die Lösung, alles im Header zu implementieren.
-
@wob
habs gelesen. Jetzt kapier ich wenigstens warum's geklappt hat, wenn ich in der cpp-Datei anstatt<T>
ein<int>
gesetzt hab.
Danke