我正在尝试实现堆栈和队列。我还获得了一个代码来测试堆栈和队列(以查看它们各自的功能是否正常工作)。
我已经实现了堆栈和quete的功能,但是在尝试编译它们时我收到错误: 在析构函数中`Stack :: ~Stack()' '''令牌之前的预期类名 在他们两个。
以下是通用Stack类:
template <class T>
class Stack
{
List<T> list;
public:
Stack();
Stack(const Stack<T>& otherStack);
~Stack();
}
List类:
template <class T>
class List
{
ListItem<T> *head;
public:
List();
List(const List<T>& otherList);
~List();
}
现在List类的析构函数工作得很好。所以记住这一点,我对析构函数的实现是:
template <class T>
Stack<T>::~Stack()
{
list.~List();
}
我在这里做错了什么?
答案 0 :(得分:7)
你应该(几乎)从不明确地调用析构函数。当你的Stack
生命结束时,它会自动调用其成员的析构函数。你不需要做任何事情。 list
将自动销毁。
如果您有一个指针p
,作为成员动态分配的对象,然后,您需要通过执行delete p;
在析构函数中进行一些清理工作。但在这里,你没有。 list
将自动销毁。
答案 1 :(得分:5)
您的list
成员是自动变量。它的生命周期(它的构造函数和析构函数被调用的时间)由语言管理。只要包含的对象超出范围,就会调用List
析构函数。
也就是说,有正当理由明确地调用析构函数(你没有,你很少会这样做),实际上你需要正确地指定类型。
在你的情况下
list.~List<T>();
List
本身就是一个模板,而不是一个类型。