uresolved external symbol mit templates in Visual C++



  • Also, ich programmiere eine template-Klassse in Visual C++ und ich habe drei dateien:

    ast.h

    template <class T>
    class TreeNode
    {
    public:
    	T data;
    	TreeNode<T> *r;
    	TreeNode<T> *l;
    
    	TreeNode( void );
    };
    
    template <class T>
    class Tree
    {
    private:
    	TreeNode<T> *root;
    	TreeNode<T> *pos;
    
    	void InternFree( TreeNode<T> * );
    	TreeNode<T> **InternFind( TreeNode<T> **w, T data );
    	void InternPrint( TreeNode<T> *, int );
    
    public:
    	Tree( void );
    	~Tree( void );
    
    	void Print( void );
    	bool Add( T data );
    	bool Remove( T data );
    };
    

    und in der Datei ast.cpp sind die funktionen ausprogrammiert. Alle Funktionen sehen so aus:

    template <class T>
    void Tree<T>::InternFree( TreeNode<T> *r )
    {
    	if( r != NULL )
    	{
    		InternFree( r->r );
    		InternFree( r->l );
    
    		delete r;
    	}
    }
    

    wenn ich in der datei main.cpp diese Klasse verwende, kommt mehrere solche

    unresolved external symbol "public: __thiscall Tree<int>::~Tree<int>(void)" (??1?$Tree@H@@QAE@XZ) referenced in function _main main.obj

    Fehlermeldungen. Wenn ich aber den gleichen Code in die Datei ast.cpp schreibe, funktioniert alles prima. Für alle Funktionen die in der ast.cpp schon einmal aufgerufen wurden, wird keine Fehlermeldung ausgegeben.

    Ich weiß nicht an was das liegt. ich hoffe ich hab mich verständlich ausgedrückt und ihr könnt mir helfen.

    danke im voraus

    dominik



  • Template-Funktionen MÜSSEN im Header definiert werden, sonst kann der Compiler nicht den richtigen Maschinencode dafür bereitstellen (beim Compilieren der "ast.cpp" weiß er schließlich nicht, ob er Code für einen Tree<int>, Treestd::string oder Tree<userstruct> benötigt.



  • und wie sage ich dem compiler das?



  • Entweder inline implementieren (in der Klassendeklaration) oder den Quelltext in eine ipp|inl|was-auch-immer Datei packen und im Header nach der Deklaration inkludieren.



  • CStoll schrieb:

    Template-Funktionen MÜSSEN im Header definiert werden

    ^^so 😉

    (Wenn du deine Quelldatei compilierst, weiß der Compiler die benötigten Typen - an der Stelle braucht er dann die Definition)



  • hab jetzt auch den quelltext in die include-datei kopiert, wie ihr das gesagt habt. aber gibt es nicht einen anderen Weg? Weil dann steht ja der gesamte Quelltext, in jeder Datei wo ich #include aufrufe.



  • Das ist Sinn der Sache und Nein, es gibt derzeit keinen anderen Weg (es sei denn, du benutzt Comeau, siehe Beitrag).


Anmelden zum Antworten