我的 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/