problem mit template
-
hi leute,
ich habe folgendes problem: ich habe zwei klassen definiert. eine klasse Object und eine klasse MetaClass.
MetaClass ist dabei eine templateklasse und bietet metafunktionalität. Object hat einen zeiger auf ein objekt von MetaClass.das ganze sieht so aus:
template <class T> class MetaClass { T * client; public: bool client_is_abstract () const; char const * get_client_class_name () const; char const * get_client_class_name_base () const; MetaClass<T> const & get_client_metaclass () const; MetaClass<T> const * get_client_metaclass_base () const; size_t get_client_size () const; size_t get_client_version () const; T & instantiate_new_client () const; T & clone_client () const; MetaClass<T> () }; class Object { MetaClass<Object> * meta_class; public: Object & clone () const; char const * get_class_name () const; char const * get_class_name_base () const; size_t get_class_size () const; size_t get_class_version () const; MetaClass<Object> const & get_metaclass () const; MetaClass<Object> const * get_metaclass_base () const; Object & instantiate_new () const; bool is (char const * const name) const; bool is_a (char const * const name) const; bool is_abstract () const; void set_prototype (MetaClass<Object> *); Object (); ~Object (); };die methoden von Object sollen aufgaben an MetaClass weiterdelegieren.
zwei ausgewählte methoden sehen so aus:Object & Object::clone () const { return this->meta_class->clone_client(); } template <class T> T & MetaClass<T>::clone_client () const { T * cloned_client = new T(*client); return *cloned_client; }beim kompilieren habe ich aber folgenden linker-fehler:
Error 1 error LNK2019: unresolved external symbol "public: class Object & __thiscall MetaClass<class Object>::clone_client(void)const " (?clone_client@?$MetaClass@VObject@@@@QBEAAVObject@@XZ) referenced in function "public: class Object & __thiscall Object::clone(void)const " (?clone@Object@@QBEAAV1@XZ) Object.objder linker findet die methode MetaClass::clone_client nicht, die in Object::clone aufgerufen wird. warum?
irgendwie muss das was mit dem template zu tun haben... wenn ich die methode wirklich konkret für Object schreibe funktioniert es. die allgemeine template methode mit T scheint der linker nicht zu mögen.
wie kann ich die syntax korrigieren, aber trotzdem sicherstellen, dass die methoden "allgemein" funktionieren?
lg t
-
Nur mal so ins Blaue: Hast Du die Implementierung der Template-Methode in einer eigenen cpp-Datei geschrieben und nicht im Header?
Laut Standard kann man zwar auch bei Templates Definition und Implementierung in getrennten Dateien verwalten (soweit ich weiß), aber kein Compiler (soweit ich weiß) unterstützt dies. Da muss die Implementierung komplett in den Header.
-
wow super, das war der fehler!
danke!eine alternative lösung ist die cpp files unten in den header files einzubinden.
lg johnny