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