将'Stack'重新定义为不同类型的符号

Redefinition of 'Stack' as different kind of symbol

本文关键字:同类型 符号 Stack 新定义 定义      更新时间:2023-10-16

我的C++类中的一个模板类练习要求使这两个类工作:

文件 node.h

#ifndef node_h
#define node_h

template<typename T>
class Node
{
private:
    friend class Stack;
    Node(T value, Node *next);
    T value;
    Node *next;
};
#endif /* node_h */

和文件堆栈.h

#ifndef stack_h
#define stack_h
#include "node.h"
template<typename T>
class Stack  // ERROR HERE!
{
public:
    Stack() : top(0) {}
    void push(T value);
    T pop();
private:
    Node<T> *top;
};
template<typename T>
void Stack<T>::push(T value)
{
    top = new Node<T>(value, top);
}
template<typename T>
T Stack<T>::pop()
{
    T result = top->value;
    top = top->next;
    return result;
}
#endif /* stack_h */

我得到了编译器抛出的"将'堆栈'重新定义为不同类型的符号"。我知道这与 node.h 文件中将 Stack 声明为友元类有关,但是如果我删除该行,则 Stack 无法访问节点的私有成员。为什么会出现此问题?

而不是

friend class Stack;

你需要

friend class Stack<T>;

为了实际编译它,我还必须添加对Node上面的Stack的前向引用。

我认为这不是必要的,所以也许有人可以解释为什么这里需要前向参考。或者,此链接建议template<typename U> friend class Stack;在没有前向引用的情况下工作,但这Stack<char>成为Node<int>的朋友,我认为这不是OP的意图。 也许有人可以澄清一下。符合g++ 7.2.0
template<typename T> class Stack;
template<typename T>
class Node
{
private:
    friend class Stack<T>;
    Node(T value, Node *next);
    T value;
    Node *next;
};