ERLEDIGT
NEIN
NEIN
ANTWORTEN
5
5
ZUGRIFFE
457
457
EMPFEHLEN
-
Hallo,
komme leider überhaupt nicht mit den doofen Templates klar. Habe eine Klasse "VarClass":
Header:
Code :1 2 3 4 5 6 7 8 9
class VarClass { public: VarClass(); virtual ~VarClass(); template<typename T> void printSomething(T a); };
CPP:
Code :1 2 3 4 5 6 7 8 9 10 11 12
#include <iostream> #include "VarClass.h" using namespace std; VarClass::VarClass() {} VarClass::~VarClass() {} template<typename T> void VarClass::printSomething(T a){ cout << "my input = " << a <<endl; }
Und jetzt habe ich noch eine Klasse Test, die die main-Funktion enthält:
Code :1 2 3 4 5 6 7 8 9
#include "VarClass.h" int main(){ VarClass* t1; t1 = new VarClass(); t1->printSomething(50); delete t1; return 0; }
Die "printSomething" Methode lässt sich aber gar nicht aufrufen. Bekomme beim kompilieren folgenden Fehler in der aufrufenden Zeile:
Wo ist der Fehler ? Jetzt ist das Programm schon so klein und ich find ihn trotzdem nichtundefined reference to `void VarClass:
rintSomething<int>(int)'

Grüßle
-
Hallo,
die Implementation der Template-Methode muss in den Header:
GrußCode cpp:1 2 3 4 5 6 7 8 9 10 11
class VarClass { public: VarClass(); virtual ~VarClass(); template<typename T> void printSomething(T a) { cout << "my input = " << a <<endl; } };
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
Jaah, danke !
So gehts.
Kannst du mir noch sagen wieso die jetzt explizit in den Header muss ? Nur damit ichs wenigstens verstehe, dann merkt man sich das leichter
Liebe Grüße
-
Hallo,
so genau habe ich das nicht mehr in Erinnerung, aber der Compiler generiert wohl aus dem Ausdruck eine neue Klasse und braucht an der Stelle auch den Zugriff auf die Implementation, die aber nicht erreichbar ist, wenn sie in einer anderen Datei liegt.
Gruß
mbmun"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
Wenn dich diese Art der Implementierung stört, so kannst du es so aufbauen, dass es der Trennung in *.h(pp) und *.cpp ähnelt. Für große Template-Klassen habe ich mir die Dateiendung tpp angewöhnt, in die ich meine Implementierung packe. Diese neue Datei wird dann einfach am Ende der Header-Datei inkludiert.
Beispiel: Header (test.h)
Code cpp:1 2 3 4 5 6 7 8 9 10 11
class VarClass { public: VarClass(); virtual ~VarClass(); template<typename T> void printSomething(T a); }; #include "test.tpp"
Implementierung - Templatefunktionen (test.tpp)
Code cpp:1 2 3 4 5
template<typename T> void VarClass::printSomething(T a) { cout << "my input = " << a <<endl; }
Implementierung - "Normale" Funktionen (test.cpp)
Code cpp:1 2 3 4
#include "test.h" VarClass::VarClass() {} VarClass::~VarClass() {}
Bei einzelenen Funktionen bzw. kleinen Klassen lohnt sich das u.U. nicht, aber bei größerem Code wird es meiner Meinung nach übersichtlicher. Die Header-Datei lässt sich besser lesen (man könnte auch einfach den Inhalt von *.tpp in die *.h direkt reinschreiben, ist halt wieder vom eigenen Stil abhängig).
-
Danke euch beiden.
Funktioniert beides, wobei ich mich für die *.tpp Lösung entschieden habe da mir die Implementierung im Header nicht soooo gefällt
Liebe Grüße
Ähnliche Themen
-
css templates
Von heikovogl im Forum CSSAntworten: 3Letzter Beitrag: 30.05.07, 10:55 -
Templates - Startseite anzeigen beim Aufruf von index.php
Von abakuz im Forum PHPAntworten: 8Letzter Beitrag: 13.10.05, 14:01 -
CSS vs. Templates
Von SilentWarrior im Forum CSSAntworten: 3Letzter Beitrag: 31.12.04, 10:41 -
Templates ..
Von Nucleus im Forum PHPAntworten: 2Letzter Beitrag: 31.05.02, 14:13 -
Templates
Von Nucleus im Forum PHPAntworten: 0Letzter Beitrag: 20.05.02, 11:51





Zitieren
Login






