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

标签 c++ class templates

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

文件节点.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 */

和文件stack.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 无法访问节点的私有(private)成员。为什么会出现这个问题?

最佳答案

代替

friend class Stack;

你需要

friend class Stack<T>;

为了真正让它编译,我还必须添加对 Stack 的前向引用以上Node . <德尔> I didn't think this was necessary , 所以也许有人可以解释为什么这里需要前向引用。 或者,this link建议 template<typename U> friend class Stack;在没有前向引用的情况下工作,但这使得 Stack<char> Node<int>的 friend 我认为这不是 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;
};

关于c++ - 将 'Stack' 重新定义为不同类型的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46984835/

相关文章:

c++ - clang++ 9.0 如何神奇地治愈 lambda 中的悬挂引用使用?

c++ - 运行 .exe 并重定向标准输入和输出

c++ - 将 std::string 中的子字符串分配给 C 风格的字符串

java - 构建单独的类(规范化?)

java - 如何在不实例化外部类的情况下实例化内部类

c++ - 为什么在模板评估的第一阶段确定名称的类型,即使是从属名称?

c++ - 为什么嵌套类型的基类不需要 `typename`?

c++ - 如果用作模板参数的类型在需要完整类型的上下文中内部使用,则何时必须完整?

c++ - 极地玫瑰 2D 偏移

java - 类对象的生命周期 : Java