我收到包含Node*
的所有内容的消息(此声明没有存储或类型说明符)。有人可以帮忙,请把我送到正确的方向吗?
template <typename type>
Node* Stack<type>::pop() {
Node* retNode; // the node to be return
if(tos == NULL) {
cerr << "*** Stack empty ***";
exit(1);
}
else {
retNode = tos; // store the location of tos
tos = tos->getLink(); // move to new tos
retNode->setLink(); // unlink the popped node from the stack
size -= 1;
}
return retNode;
}
我确信它正在处理Node*
,但我无法弄清楚是什么。
下面是我在堆栈类中使用的节点类的声明。如果您需要我的堆栈类声明,请告诉我,因为我无法看到问题。
template <typename type>
class Node<type>{
private:
type data;
Node *link;
public:
Node(type p_item, Node *p_link);
type getData() const;
Node* getLink() const;
void setData(type p_data);
void setLink(Node *node);
};
答案 0 :(得分:1)
Node
是一个类模板,因此您无法使用Node
或Node *
作为数据类型。您必须在尖括号中添加模板参数,例如Node<int>
或Node<char> *
等。
在您给出的具体示例中,以下似乎是合适的:
template <typename type>
Node<type>* Stack<type>::pop() {
Node<type>* retNode;
/* ... */
return retNode;
}
即。用于Stack
的相同类型参数也应该(可能)用于Node
。
另外两个注意事项:
看起来很奇怪,虽然Node
模板似乎实现了堆栈的内部数据结构,但是Node<type> *
指针由堆栈的pop函数返回。
type
对象似乎更自然(更好的封装,对堆栈用户更直观)。
当堆栈为空时,pop函数调用exit
(从而使整个进程停止)似乎很奇怪。也许返回nullptr
或虚拟对象,或抛出异常(或类似策略)会更合适。