我有一个模板类不工作检查和删除预期
template <class T>
class Node
{
private:
T data;
public:
Node<T> *next;
Node(T initial);
~Node();
};
和析构函数如下:
template <class T>
Node<T>::~Node()
{
if (std::is_pointer<T>::value)
{
delete this->data;
}
}
template <class T>
LinkedList<T>::~LinkedList() {
Node<T> *this_nodes = this->head;
Node<T> *next = NULL;
while (this_nodes)
{
next = this_nodes->next;
delete this_nodes;
this_nodes = next;
}
}
然而,当我试图使用g ++与编译C++ 11 ,用下面的驱动程序代码
LinkedList<int> list;
list.insert(5);
assert(list.read() == 5);
我得到以下错误:
error: type ‘int’ argument given to ‘delete’, expected pointer
该节点是LinkedList的内部,我离开了,因为它不是完全有必要帮助回答这个问题。我不确定为什么会出现这个错误,因为我在尝试删除它之前已经确认数据是指针。
有人能让我进一步了解为什么这不起作用/替代方法? (注:不能使用智能指针这个任务)
'删除这个 - >数据;' - '数据'是一个'int'。你为什么要“删除”它?包含的'Node'是应该删除的内容(事实上,正如此,否则你的析构函数将不会被触发)。如果你试图取消那些不是指针的东西的资格,那么代码本身应该被SFINAE或专业化的东西忽略掉;不在运行时的if块中。 –
WhozCraig
你为什么要删除'data'开头?不要管它。如果数据是动态分配的,你的班级不应该有任何想法。一个指针不需要用'new'分配,所以你的指针检查甚至不被保证。 – PaulMcKenzie
驱动程序的其他部分使用其他元素,如int *,Card *(自定义类)和其他一些元素。这些数据不会被空的构造函数删除,我不知道如何适当释放内存。我知道数据是一个整数,因此if语句应该失败并且不做任何事情。它应该只反应,当我得到一个实际的指针作为类型(节点例如) –
ZeldaZach