2013-04-14 84 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文件中脱身,但只如果你明确地实例化所有你将要使用它的类型的模板。最简单的解决方案仍然是将整个定义放在头文件中。