C++ 奇怪的c++;变量声明错误,表示类是其自身的私有成员

C++ 奇怪的c++;变量声明错误,表示类是其自身的私有成员,c++,C++,我正在开发一个解析器来构建抽象语法树 我的所有节点都有这个节点基类 // Base for all nodes class Node { public: virtual ~Node(); virtual int position() = 0; // code string index of first character associated with this Node virtual int end() = 0; // code string index of f

我正在开发一个解析器来构建抽象语法树

我的所有节点都有这个节点基类

// Base for all nodes
class Node {
  public:
    virtual ~Node();
    virtual int position() = 0; // code string index of first character associated with this Node
    virtual int end() = 0; // code string index of first immediately after the last character associated with this Node
};
其中一个子类是表达式节点:

// Expression node
class ExpressionNode: Node {
  public:
    virtual ~ExpressionNode();
    virtual int position() = 0;
    virtual int end() = 0;
};
它的一个子类是identifier节点,其中一个成员出现了一个非常奇怪的错误:

// Identifier Expression
class IdentNode: ExpressionNode {
  public:
    int namePosition;
    std::string name;

    Node *n; // Error - 'Node' is a private member of 'Node'

    IdentNode();
    ~IdentNode();

    virtual int position();
    virtual int end();
};
为什么会出现这个错误?我真的很困惑。

(我假设您打算从节点派生ExpressionNode。)默认情况下,继承是
私有的
,这意味着派生类无法访问基类成员。使用
protected
(成员可以通过派生作用域访问,但不能通过其他作用域访问)或
public
继承(base中的所有公共成员都可以在任何地方访问)

(我假设您希望ExpressionNode从节点派生。)默认情况下,继承是
private
,这意味着派生类无法访问基类成员。使用
protected
(成员可以通过派生作用域访问,但不能通过其他作用域访问)或
public
继承(base中的所有公共成员都可以在任何地方访问)


已尝试
类标识节点:公共表达式节点{
已经存在?只是一个问题:你打算让
ExpressionNode
Node
派生吗?哎哟,它在我的代码中确实存在,只是没有在这里键入,编辑以反映你所有的代码?我只是在Visual Studio中输入了它,它构建得很好。一切都很好。所以,不确定你为什么会出现这样的错误。@MichaelTaufen实际上我相信错误表明类构造函数是私有成员。请再次彻底阅读错误消息。已尝试
class IdentNode:public ExpressionNode{
已经存在?只是一个问题:你打算让
ExpressionNode
Node
派生吗?哎哟,它在我的代码中确实存在,只是没有在这里键入,编辑以反映你所有的代码?我只是在Visual Studio中输入了它,它构建得很好。一切都很好。所以,不确定你为什么会出现这样的错误。@MichaelTaufen事实上,我相信错误表明类构造函数是私有成员。请仔细阅读错误消息。在本例中,他继承了什么?尽管如此,即使ExpressionNode没有公开从Node继承,它仍然可以指向类Node的对象。是否有原因导致此错误似乎只发生在两级继承吗?@black,我会尽快接受,时间还剩2分钟。@MichaelTaufen:我猜这与名称的查找方式有关。我需要运行,但也许我以后会进一步研究。在这个示例中,他继承了什么?尽管如此,即使ExpressionNode没有公开从No继承de,它仍然可以指向类节点的对象。是否有原因导致此错误似乎只在两级继承之后发生?@black,我会尽快接受,时间还剩2分钟。@MichaelTaufen:我猜这与名称的查找方式有关。我需要运行,但可能以后会进一步研究。
class ExpressionNode : public Node {
...
class IdentNode : public ExpressionNode {