【问题标题】:Redefinition of 'Stack' as different kind of symbol将“堆栈”重新定义为不同类型的符号
【发布时间】:2017-10-27 23:42:50
【问题描述】:

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

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

【问题讨论】:

    标签: c++ class templates


    【解决方案1】:

    代替

    friend class Stack;
    

    你需要

    friend class Stack<T>;
    

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

    【讨论】:

    • 这可能会有所帮助:stackoverflow.com/questions/4492062/…
    • @MarkMucha 我认为这个在 OPs 案例中更清楚。我将编辑我的答案stackoverflow.com/questions/8967521/…
    • 现在我遇到了第二个问题,虽然 push() 方法找不到合适的 Node 构造函数。架构 x86_64 的未定义符号:“Node::Node(int, Node*)”,引用自:main.o 中的 Stack::push(int) 我是否应该寻求帮助在这里还是在一个新问题中?
    • 是的。确保你实施它。您只在粘贴的代码中声明了它。将Node(T value, Node *next); 替换为Node(T v, Node *n) : value(v), next(n) {}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多