首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用cpp将节点插入到二进制搜索树中

使用cpp将节点插入到二进制搜索树中
EN

Stack Overflow用户
提问于 2013-04-14 21:44:17
回答 1查看 1K关注 0票数 0

我很难将节点插入到二进制搜索树中。我一直在

错误LNK2019:未解决的外部符号"public:__thiscall tree::tree(void)“(??0$tree@H@@QAE@XZ)

有人能告诉我问题出在哪里吗。

treenode.h

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
#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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2013-04-14 21:52:57

问题是,tree的构造函数不是tree.h头文件中定义的。编译器需要模板的完整定义才能实例化它。现在,一些文件包含tree.h,编译器看到了tree类的类定义,但是找不到它的构造函数的定义。

因此,您需要将tree.cpp文件中的所有内容移到tree.h中。(这不适用于普通的、非模板类。)

它实际上要比这个稍微复杂一点:Storing C++ template function definitions in a .CPP file

因此,您可以将该定义放入.cpp文件中,但前提是要显式实例化所有类型的模板。最简单的解决方案仍然是将整个定义放在头文件中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16004701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档