Template-Klasse
-
Hallo,
ich hab hier ein sehr simples Beispielprogramm, das trotzdem nicht das tut, was es soll...
#include "myPrintFunctor.h" #include <string> int main() { std::string s("Hallo Welt"); MyPrintFunctor<std::string> mpf; mpf(s); }#ifndef MYPRINTFUNCTOR_H #define MYPRINTFUNCTOR_H template<typename T> struct MyPrintFunctor { void operator()(const T&); }; #endif#include "myPrintFunctor.h" #include <iostream> template<typename T> void MyPrintFunctor<T>::operator()(const T& t) { std::cout<< t << std::endl; }Der Fehler beim Kompilieren ist:
/tmp/ccmGQkBt.o: In function
main': testing2.cpp:(.text+0x38): undefined reference toMyPrintFunctor<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::operator()(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
collect2: ld returned 1 exit statusEs kann also die operator-Definition nicht gefunden werden, wenn ich mich nicht täusche.
Kann mir jemand sagen, was ich falsch mache

-
Templates kannst du nicht in .cpp und .h aufteilen.
Implementiere das Template im Header und dann dürfte es funktionieren
Gruß
Tobi
-
Vielen Dank für die schnelle Hilfe.
So als Resümee: Aufteilen lässt der Code sich zwar nicht, trennen aber schon. Also setzt man die Datei mit den Definition der Memberfunktion gerade unter die Klassendefinition.
-
moagnus schrieb:
So als Resümee: Aufteilen lässt der Code sich zwar nicht, trennen aber schon. Also setzt man die Datei mit den Definition der Memberfunktion gerade unter die Klassendefinition.
und um trotzdem nen überschaubaren header zu haben, lagert man die definitionen meistens aus und nennt die datei dann *.inl oder *.impl und includiert diese dann halt im header
bb
-
Danke für den Tipp.
Was ist eigentlich der technische Hintergrund dafür, dass bei Template-Klassen die Trennung nicht wie gewöhnlich funktioniert?
-
Aus den meistgestellten Fragen:
5. Ich hab ein Template. Jetzt bekomm ich aber den Fehler "nicht aufgelöstes externes Symbol". Warum?
Meistens kommt diese Frage, wenn der Fragesteller das Template aufgeteilt hat, wie er es von Klassen gewohnt ist: Klassendefinition in eine Header-Datei, Memberdefinitionen in eine entsprechende cpp-Datei. Allerdings ist ein Template nur eine Vorlage, die richtigen Klassen/Funktionen erstellt der Compiler erst beim Kompilieren nach dieser Vorlage. Nun ist es wohl klar, dass dem Compiler dafür die gesamte Vorlage zur Verfügung stehen muss. Er sieht aber nur die zu kompilierende Quellcode-Datei inklusive aller eingebundenen Header (man spricht von einer Übersetzungseinheit), die Definitionen der Member werden deshalb nicht gefunden -> nicht aufgelöstes externes Symbol.
Mögliche Workarounds:
- alles direkt in die Klassendefinition einfügen; das wird bei großen Templates ziemlich unübersichtlich
- am Ende der Header-Datei eine Implementationsdatei inkludieren, in der die Member definiert werden (üblicherweise hat diese die Endung .impl)
- die gewünschten Template-Instanzen explizit definieren
- das Schlüsselwort export benutzen; allerdings gibt es kaum Compiler, die dieses unterstützen
-
Einfach nur sorry und danke
