将“堆栈”重新定义为不同类型的符号

时间:2017-10-27 23:42:50

标签: c++ class templates

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

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

1 个答案:

答案 0 :(得分:3)

而不是

friend class Stack;

你需要

friend class Stack<T>;

为了实际编译这个,我还必须在Stack之上添加Node的前向引用。 I didn't think this was necessary,所以也许有人可以在这里解释为什么需要前向引用。或者,this link建议template<typename U> friend class Stack;在没有前向引用的情况下工作,但这会使{{} 1}} Stack<char>的朋友,我认为这不是OP的意图。也许有人可以澄清一下。符合Node<int>

g++ 7.2.0