Binary_tree.h#ifndef Binary_Tree
#define Binary_Tree//Node类
template <class Entry>
struct Binary_node 
{
// data members:
Entry data;
Binary_node<Entry> *left;
Binary_node<Entry> *right;
// constructors:
Binary_node( );
Binary_node(const Entry &x);
};
//Binary_Tree类
template <class Entry>
class Binary_tree
{
public:
Binary_tree();
Binary_tree(const Binary_tree<Entry> &x);
~Binary_tree();
Binary_tree & operator = (const Binary_tree<Entry> &original);
bool empty() const;
void preorder(void (*visit)(Entry &));
void inorder(void (*visit)(Entry &));
void postorder(void (*visit)(Entry &));
int size( ) const;
void clear( );
int height( ) const;
void insert(const Entry &);
protected:
Binary_node<Entry> *root;
void recursive_inorder(Binary_node<Entry> *sub_root,void (*visit)(Entry &));
int recursive_size(Binary_node<Entry> *sub_root) const;
int recursive_height(Binary_node<Entry> *sub_root) const;
Binary_node<Entry> *recursive_copy(Binary_node<Entry> *sub_root);
};#endif
Binary_tree.cpp#include "Binary_Tree.h"
#include "iostream"
using namespace std;template <class Entry>
Binary_tree<Entry>::Binary_tree()
{
root=NULL;
}template <class Entry>
Binary_tree<Entry>::Binary_tree(const Binary_tree<Entry> &x)
{
root=recursive_copy(x.root);
}template <class Entry>
Binary_tree<Entry>::~Binary_tree()
{
root=NULL;
}template <class Entry>
bool Binary_tree<Entry> :: empty( ) const
{
return root == NULL;
}template <class Entry>
int Binary_tree<Entry>::size() const
{
return recursive_size(root);
}template <class Entry>
int Binary_tree<Entry>::height() const
{
return recursive_height(root);
}template <class Entry>
int Binary_tree<Entry> :: recursive_height(Binary_node<Entry> *sub_root) const
{
if (sub_root == NULL) return 0;
int l = recursive_height(sub_root->left);
int r = recursive_height(sub_root->right);
if (l > r) return 1 + l;
else return 1 +r;
}template <class Entry>
void Binary_tree<Entry> :: inorder(void (*visit)(Entry &))
{
recursive_inorder(root, visit);
}template <class Entry>
void Binary_tree<Entry> ::recursive_inorder(Binary_node<Entry> *sub_root,void (*visit)(Entry &))
{
if (sub_root != NULL) 
{
recursive_inorder(sub_ root->left, visit);
(*visit)(sub_root->data);
recursive_inorder(sub_root->right, visit);
}
}template <class Entry>
int Binary_tree<Entry> :: recursive_size(Binary_node<Entry> *sub_root) const
{
if (sub_root == NULL) return 0;
return  1+recursive_size(sub_root->left)+ recursive_size(sub_root->right);
}template <class Entry>
Binary_node<Entry> *Binary_tree<Entry> :: recursive_copy(Binary_node<Entry> *sub_root)
{
cout << "执行了copy函数" << endl;
if (sub_root == NULL) return NULL;
Binary_node<Entry> *temp = new Binary_node<Entry>(sub_root->data);
temp->left = recursive_copy(sub_root->left);
temp->right = recursive_copy(sub_root->right);
return temp;
}Main.cpp
#include "iostream"
#include "Binary_Tree.cpp"
using namespace std;
void main()
{
Binary_tree<int> my;
cout << my.size() << endl; Binary_tree<int> my1(my);
cout << my1.size(); Binary_tree<int> my2(my);
}
不是我自己写的代码,是老师PPt上拷贝的,同学拷贝的没有错误,我拷过来就有错误,错误如下:
Main.obj : error LNK2001: unresolved external symbol "public: __thiscall Binary_node<int>::Binary_node<int>(int const &)" (??0?$Binary_node@H@@QAE@ABH@Z)
Debug/Binary_tree.exe : fatal error LNK1120: 1 unresolved externals
大概是说我的那个重载的构造函数找不到,但是我将那个构造函数
template <class Entry>
Binary_tree<Entry>::Binary_tree(const Binary_tree<Entry> &x)
{
root=recursive_copy(x.root);
}
的哪一行 root=recursive_copy(x.root);屏蔽掉,然后编译,错误;删掉debug内容,编译,通过,运行,出错;恢复那一行,删掉debug,编译通过,运行出错;快崩溃了。换了一台电脑,用2010编译(之前是6.0),同样的错误。崩溃了……

解决方案 »

  1.   

    template <class Entry>
    struct Binary_node 
    {
        // data members:
        Entry data;
        Binary_node<Entry> *left;
        Binary_node<Entry> *right;
        // constructors:
        Binary_node( );
        Binary_node(const Entry &x);
    };
    把struct改为class,或者添加public:
      

  2.   

    #include "iostream"
    #include "Binary_Tree.cpp"??? 
    应该是 #include "Binary_Tree.h" 吧?
      

  3.   


    //Node类
    template <class Entry>
    struct Binary_node 
    {
        // data members:
        Entry data;
        Binary_node<Entry> *left;
        Binary_node<Entry> *right;
        // constructors:
        Binary_node( );
        Binary_node(const Entry &x);
    };这个只有定义,没有实现,必须把实现部分也拷贝过来。
      

  4.   


    这个按理说是包含头文件,但是据说使用了模板类以后必须要么实现也在头文件里,要么包含cpp文件,不然每个函数实现都找不到。
      

  5.   

    给力!!!再仔细检查一遍,原来报错中是说Binary_Node结构体没有写构造函数,不是说Binary_tree没有写构造函数
      

  6.   

    错误信息是说找不到外部链接的符号,Binary_Node的两个构造只是声明了,没有定义,所以会找不到符号
      

  7.   

    template <class Entry>
    struct Binary_node 
    {
        // data members:
        Entry data;
        Binary_node<Entry> *left;
        Binary_node<Entry> *right;
        // constructors:
        Binary_node( ); // 这里的问题吧
        Binary_node(const Entry &x);
    };