0

我收到的所有内容都包含此消息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);
};
4

1 回答 1

1

Node是一个类模板,所以你不能使用NodeorNode *作为数据类型。您必须在尖括号中添加模板参数,例如Node<int>Node<char> *等。

在您给出的具体示例中,以下内容似乎是合适的:

template <typename type>
Node<type>* Stack<type>::pop() {
  Node<type>* retNode;
  /* ... */
  return retNode;
}

即,用于的相同类型参数也Stack应该(可能)用于Node

另外两个注意事项:

  1. 奇怪的是,虽然Node模板似乎实现了堆栈的内部数据结构,但堆栈Node<type> *的 pop 函数返回了指针。type返回对象似乎更自然(并且封装更好,并且对堆栈的用户来说更直观) 。

  2. exit当堆栈为空时,pop 函数调用(从而使整个进程停止)似乎也很奇怪。也许返回nullptr,或者一个虚拟对象,或者抛出一个异常(或类似的策略)会更合适。

于 2012-10-17T06:01:36.133 回答