类中析构函数定义的Collect2错误

时间:2016-04-24 21:44:26

标签: 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;

    public:
        Binary_tree()
        {
            root = NULL;
        }
        ~Binary_tree();
        void insert(T val);
        Node<T> *search(T val);
};

我的main.cc

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

using namespace std;

int main()
{
    Binary_tree<char> tree;
    return 0;
}

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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