2013-04-14 3 views
0

이진 검색 트리에 노드를 삽입하는 데 문제가 있습니다. 나는cpp를 사용하여 노드를 이진 검색 트리에 삽입

오류 LNK2019가 계속 : 확인되지 않은 외부 기호를 "공개 : __thiscall 나무 :: 나무 (무효)"(? ?? 0 $ 트리 @ 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

'tree' 정의 앞에'template '이 없습니다. 귀하의 질문에 간단하게 누락 된 것으로 가정하지만, 경우에 따라 신호를 보내고 있습니다. – didierc

답변

0

문제는 tree의 생성자가 tree.h 헤더 파일에을 정의되지 것입니다. 컴파일러는 템플릿을 인스턴스화하기 위해 템플릿의 전체 정의가 필요합니다. 지금 당장 일어나는 일은 tree.h가 포함 된 파일이 있고 컴파일러가 tree 클래스의 클래스 정의를보고 있지만 해당 생성자에 대한 정의를 찾을 수 없다는 것입니다.

그래서 tree.cpp 파일에있는 모든 것을 tree.h로 옮겨야합니다. (이것은 보통, 비 템플릿 클래스에 적용되지 않습니다.)

그것은 약간 실제보다 더 복잡 : 그래서 Storing C++ template function definitions in a .CPP file

당신이 .cpp 파일에 정의를두고 멀리 얻을 수 있지만 수 있습니다 템플릿과 함께 사용할 모든 유형의 템플릿을 명시 적으로 인스턴스화하는 경우 가장 간단한 해결책은 여전히 ​​전체 정의를 헤더 파일에 넣는 것입니다.

관련 문제