2013-04-14 117 views
0

我無法嘗試將節點插入到二進制搜索樹中。我不斷收到使用cpp將節點插入到二進制搜索樹中

錯誤LNK2019:無法解析的外部符號 「公用:__thiscall樹::樹(無效)」(??? 0 $樹3 H @@ QAE @ XZ)

有人能告訴我是什麼問題是請。

treenode.h

template <class T> class tree; 

//treenode class-template definition 
template <class T> 
class treenode 
{ 
friend class tree<T>; 

public: 

    treenode(const T &d, treenode<T> *l, treenode<T> *r) 
     : data(d), leftptr(l), rightptr(r) 
    { 

    } 

    treenode(const T &d): 
     leftptr(0), 
     data(d), 
     rightptr(0) 
    { 

    } 

    T getData() const 
    { 
     return data; 
    } 

private: 
    treenode<T> *leftptr; 
    T data; 
    treenode<T> *rightptr; 
};//end class treenode 

tree.h中

class tree 
{ 
public: 
    tree(); //initializes the private data member 

    void insertNode (treenode<T> **, const T &); 
    void preOrderTraversal(treenode<T> *) const; 
    void postOrderTraversal(treenode<T> *) const; 
    void inorderTraversal(treenode<T> *) const; 

private: 
    treenode<T> *rootptr; 
}; 

tree.cpp

#include <iostream> 
#include "tree.h" 
using namespace std; 

//constructor 
template< class T> 
tree<T>::tree() 
{ 
rootptr = 0; //indicate tree is initially empty 
}//end tree constructor 


//insert node in tree 
template <class T> 
void tree<T>::insertNode(treenode<T> **rootptr, const T &val) 
{ 
// subtree is empty; create new treenode containing value 
if(*rootptr == 0) 
    *rootptr = new treenode<T>(val); 
else // subtree is not empty 
{ 
    // data to insert is less than data in current node 
    if(val < (*rootptr)->data) 
    { 
     insertNode(&((*rootptr)->leftptr), val); 
    } 
    else 
    { 
     // data to insert is greater than data in current node 
     if(val > (*rootptr)->data) 
     { 
      insertNode(&((*rootptr)->rightptr), val); 
     } 
    }//end else 
}//end else 
}//end function insertNode 

tester.cpp

int main() 
{ 
    tree <int> create; 
    int userVal; 

    cout << "Enter 10 Integers" << "\n\n"; 
    for(int i=0; i<10; i++) 
{ 
    cout << "-> "; 
    cin >> userVal; 
    createTree.insertNode(0, userVal); 
    } 

    system("pause"); 
    return 0; 
}//end main 
+0

您在類「樹」定義之前缺少'template '。我認爲這是你的問題中的一個簡單的遺漏,但我發信號以防萬一。 – didierc

回答

0

的問題是,對於tree構造是不tree.h頭文件中定義。 編譯器需要模板的完整定義才能實例化它。現在,會發生什麼是某個文件包含tree.h,編譯器會看到tree類的類定義,但找不到其構造函數的定義。

因此,您需要將tree.cpp文件中的所有內容移動到tree.h中。 (這並不適用於普通的非模板類。)

它實際上是稍微複雜多了: Storing C++ template function definitions in a .CPP file

所以你可以把定義在.cpp文件中脫身,但只如果你明確地實例化所有你將要使用它的類型的模板。最簡單的解決方案仍然是將整個定義放在頭文件中。