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

Collect2 error on destructor definition within a class

如果包含“~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;
}

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

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

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

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