2016-04-24 61 views
1

如果我包含“〜Binary_tree()”析构函数,则会出现错误。但是,当我删除它,一切都编译。Collect2在类中的析构函数定义上的错误

我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; 
} 

回答

1

您还没有定义你的析构函数,只宣布它。它应该是:

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

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

0

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

相关问题