C++ 类内析构函数定义的Collect2错误

C++ 类内析构函数定义的Collect2错误,c++,class,tree,C++,Class,Tree,如果包含“~Binary_tree()”析构函数,则会出现错误。但当我删除它时,一切都会编译 我的node.h文件 template<class T> class Binary_tree { private: void insert(T val, Node<T> *ptr); Node<T> *search(T val, Node<T> *ptr); Node<T> *root;

如果包含“~Binary_tree()”析构函数,则会出现错误。但当我删除它时,一切都会编译

我的node.h文件

template<class T>
class Binary_tree
{
    private:
        void insert(T val, Node<T> *ptr);
        Node<T> *search(T val, Node<T> *ptr);
        Node<T> *root;

    public:
        Binary_tree()
        {
            root = NULL;
        }
        ~Binary_tree();
        void insert(T val);
        Node<T> *search(T val);
};
模板
类二叉树
{
私人:
无效插入(T val,节点*ptr);
节点*搜索(T val,节点*ptr);
节点*根;
公众:
二叉树()
{
root=NULL;
}
~Binary_树();
无效插入(T val);
节点*搜索(T val);
};
我的main.cc

#include<iostream>
#include "node.h"

using namespace std;

int main()
{
    Binary_tree<char> tree;
    return 0;
}
#包括
#包括“node.h”
使用名称空间std;
int main()
{
二叉树;
返回0;
}

您没有定义析构函数,只是声明了它。应该是:

~Binary_tree() { /*delete tree*/ }

您看到的实际上是链接器错误,而不是编译错误。您可能认为您还没有定义其他一些方法,如
insert
search
,并且您没有得到任何错误,。。。但它们不会在代码中被调用,所以链接器不会输出错误。另一方面,在您的示例中,当
tree
对象超出范围时,会隐式调用析构函数。如果您自己不添加一个,编译器将自己创建定义-这就是为什么在删除
~Binary_tree()的声明时不会出现错误的原因。此编译器合成的析构函数不会释放您的树,您必须自己执行此操作-或使用共享PTR。

模板是宏的替代品,因此模板定义必须在实例化点可用。您应该将~Binary_tree和所有其他方法的定义放入模板定义中