如果我包含“~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;
}
答案 0 :(得分:1)
您尚未定义析构函数,只是声明了它。它应该是:
~Binary_tree() { /*delete tree*/ }
您看到的实际上是链接器错误,而不是编译错误。您可能认为您还没有定义其他几个方法,例如insert
或search
,并且您没有得到任何错误,但是它们不会在您的代码中调用 - 因此链接器不会输出错误。另一方面,当tree
对象超出范围时,会隐式调用示例中的析构函数。如果你自己不加一个,编译器会自己创建定义 - 这就是你删除~Binary_tree();
声明时没有错误的原因。这个编译器合成的析构函数不会释放你的树,你必须自己做 - 或者使用共享的ptrs。
答案 1 :(得分:0)
模板是宏的替换,因此模板定义必须在实例化点可用。您应该将~binary_tree的定义和所有其他方法放在模板定义中。