Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ &引用;应为类名“…”;。。。析构函数实现中的问题_C++_Class_Linked List_Stack_Destructor - Fatal编程技术网

C++ &引用;应为类名“…”;。。。析构函数实现中的问题

C++ &引用;应为类名“…”;。。。析构函数实现中的问题,c++,class,linked-list,stack,destructor,C++,Class,Linked List,Stack,Destructor,我正在尝试实现一个堆栈和一个队列。我还提供了一个测试堆栈和队列的代码(以查看它们各自的函数是否正常工作) 我已经实现了stack和quete的函数,但是在尝试编译它们时,我得到了错误: 在析构函数“Stack::~Stack()”中 在“(”标记之前应为类名 在他们两人身上 以下是通用堆栈类: template <class T> class Stack { List<T> list; public: Stack(); Stack(const

我正在尝试实现一个堆栈和一个队列。我还提供了一个测试堆栈和队列的代码(以查看它们各自的函数是否正常工作)

我已经实现了stack和quete的函数,但是在尝试编译它们时,我得到了错误: 在析构函数“Stack::~Stack()”中 在“(”标记之前应为类名
在他们两人身上

以下是通用堆栈类:

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

    Stack();

    Stack(const Stack<T>& otherStack);

   ~Stack();
}
模板
类堆栈
{
名单;
公众:
堆栈();
堆栈(常量堆栈和其他堆栈);
~Stack();
}
列表类:

template <class T>
class List
{
    ListItem<T> *head;

    public:

    List();

    List(const List<T>& otherList);

    ~List();
}
模板
班级名单
{
列表项目*标题;
公众:
List();
列表(常量列表和其他列表);
~List();
}
现在List类的析构函数工作正常。请记住,我对析构函数的实现是:

template <class T>
Stack<T>::~Stack()
{

                 list.~List();
}
模板
堆栈::~Stack()
{
list.~list();
}
我做错了什么?

您不应该(几乎)明确地调用析构函数。当您的
堆栈的生命结束时,它将自动调用其成员的析构函数。您不需要做任何事情。
列表将自动销毁


如果您有一个指针,
p
,指向作为成员的动态分配对象,那么您需要通过执行
delete p;
在析构函数中进行一些清理。但是在这里,您没有。
list
将自动销毁。

您的
list
成员是一个自动变量。它的生存期(调用其构造函数和析构函数的时间)由语言管理。一旦包含的对象超出范围,就会调用
列表
析构函数

这就是说,显式调用析构函数(您没有析构函数,也很少有析构函数)是有充分理由的,要真正做到这一点,您需要正确指定类型

在你的情况下,那就是

list.~List<T>();
list.~list();

List
本身是一个模板,而不是一种类型。

不要显式调用析构函数-语言会为您解决这个问题。丢失
List.~List()
调用。该成员将自毁。@molbdnilo,@WhozCraig谢谢大家,它现在可以工作了!@WhozCraig添加了一个“几乎”:DSilly rabbit=P非常好的答案,顺便说一句。吹毛求疵:
list
在技术上不一定具有自动存储持续时间,它与包含它的
堆栈
对象具有相同的存储持续时间。