4

我正在尝试实现堆栈和队列。我还获得了一个代码来测试堆栈和队列(以查看它们各自的功能是否正常工作)。

我已经实现了堆栈和 quete 的功能,但是在尝试编译它们时出现错误: 在析构函数 `Stack::~Stack()' 中预期的类名在 '(' 标记之前

以下是通用的 Stack 类:

template <class T>
class Stack
{
    List<T> list;
 public:

    Stack();

    Stack(const Stack<T>& otherStack);

   ~Stack();
}

列表类:

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();
}

我在这里做错了什么?

4

2 回答 2

7

您应该(几乎)永远不要显式调用析构函数。当你Stack的生命结束时,它会自动调用其成员的析构函数。你不需要做任何事情。list会自动销毁。

如果你有一个指向p动态分配对象的指针,作为成员,那么你需要在析构函数中做一些清理工作delete p;。但在这里,你没有。list会自动销毁。

于 2013-02-08T16:59:18.127 回答
5

Your list member is an automatic variable. Its lifetime (the time when its constructor and destructor are callled) is managed by the language. As soon as the containing object goes out of scope, the List destructor will be called.

That said, there are valid reasons to call a destructor explicitly (you don't have one and you rarely will) and to actually do it you need to specify the type correctly.

In your case that would be

list.~List<T>();

List itself is a template, not a type.

于 2013-02-08T17:02:11.790 回答