linker fehler wenn destruktor einer template klasse inhalt besitzt (methoden, die sonst aber funktionieren)
-
hm.. hab ne template klasse geschrieben die eine liste enthalten soll.... sie funktioniert wunderbar und ohne probleme nur wenn ich dann logischerweise in den destruktor die methode clearList(); über this->clearList(); aufrufen will geht das nicht... >> LINKER FEHLER ...hab spaßhalber mal ne andere methode der klasse darein geschrieben und ging auch nich... lediglich ein int a=0; ginge oder so... weiß einer was da falsch is? ich habs auch schon mit nem
...
public: virtual ~cList();
...
probiert und dann in der cpp:template <class ElementTyp> _cList::cList<ElementTyp>::~cList()
{
this->clearList();
}geschrieben und er hat immer noch das gleiche problem... hmsl das is irgendwie nervig zumal der Compiler gar keine fehler ausspuckt also von der Syntax scheint ja alles richtig zu sein hm..
Als INFO: ich verwende VC++ .NET 2003
EDIT: _cList ist ein namespace in der sich die klasse befindet...
übrigens: wenn ich nix in den Destruktor schreibe dann kommt kein linkerfehler... aber damit fabriziere ich ja nur Speicherleaks
-
wenn ich mich recht entsinne gibt es haufenweise linker probleme, wenn man templates in .cpp implementiert statt sie in die header zu paken.
also einfach den ganzen code in die .h paken.können überhaupt keine compiler templates in der .cpp verwalten ?
-
hm.. hey du hast recht hm... funzt im header .... na darauf soll ma einer kommen o_O .. ich google schon seit nem halben tag *grmL* hätt ich ma früher gepostet
danke nochmals...
EDIT: DOLL dann kann ich ja auf mein C++ ReferenceBook auch sch*** ... da stehts auch zur hälfte in der cpp ....da denkt man mal es steht nur richtiges in sooner reference und dann nur müll tzzt
...
EDIT die x.te... Deswegen hat man wohl auch vorkompilierte header erfunden.. weil die jetzt auch schon für definitionen missbraucht werden
-
probier mal was in http://userpage.fu-berlin.de/~ram/pub/pub_F44G971H/c++_funktionsschablone_de steht
Wenn eine Schablonenfunktion von anderen Übersetzungseinheiten aus verwendet werden soll, dann darf sie nicht in einem namenlosen Namensraum definiert werden und muß mit dem Schlüsselwort "export" gekennzeichnet werden (nicht zu verwechseln mit dem ähnlich klingenden Schlüsselwort "extern").
maximum1.hnamespace tut { template<typename T> extern T maximum( T const a, T const b ); } maximum1.cpp export template<typename T> T ::tut::maximum( T const a, T const b ){ return a > b ? a : b; };
maximum1_ec.cpp
#include <iostream> // ::std::cout #include <ostream> // << #include "maximum1.h" // ::tut::maximum int main() { ::std::cout << ::tut::maximum<int>( 10, 10 )<< '\n'; ::std::cout << ::tut::maximum( 10, 10 )<< '\n'; }
Es gibt allerdings nur wenige C++ -Implementation. Viele sogenannte „C++ -Compiler“ unterstützen in Wirklichkeit nur einen Teil der Sprache C++, zu dem das Schlüsselwort "export" nicht gehört. Bei solchen Produkten muß die Schablone dann ersatzweise in der Kopfdatei des sie exportierenden Moduls definiert werden.
maximum2.hnamespace tut { template<typename T> T maximum( T const a, T const b ){ return a > b ? a : b; }; }
maximum2_ec.cpp
#include <iostream> // ::std::cout #include <ostream> // << #include "maximum2.h" // ::tut::maximum int main() { ::std::cout << ::tut::maximum<int>( 10, 10 )<< '\n'; ::std::cout << ::tut::maximum( 10, 10 )<< '\n'; }
-
hm.. ne geht net... bei dem wort hat VC++ nicht mal Syntaxhighlighting... naja dann muss ichs eben im header lassen..