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.obj

    der 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


Anmelden zum Antworten