Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ A类在C类中不可见,但在主类中可见。为什么?_C++ - Fatal编程技术网

C++ A类在C类中不可见,但在主类中可见。为什么?

C++ A类在C类中不可见,但在主类中可见。为什么?,c++,C++,我猜这与B从A私下继承有关,但我无法确定 编辑:错误为“A类不可见”。使用g++编译。名称查找与访问检查是分开的。当您从一个类继承时,该类的名称被注入继承类的作用域。因此,在类C中,您可以选择名称A,但它不可访问 一种解决方案是编写::A而不是A虽然阿尔夫的答案是正确的,但我觉得可以把它说得更清楚一点(谁知道,也许会更让人困惑)。类的名称被注入到类本身的作用域中。正如他所提到的,只有在查找找到标识符的含义后,才会检查访问说明符。在问题代码中: class A {}; class B : pr

我猜这与
B
A
私下继承有关,但我无法确定


编辑:错误为“A类不可见”。使用g++编译。

名称查找与访问检查是分开的。当您从一个类继承时,该类的名称被注入继承类的作用域。因此,在类
C
中,您可以选择名称
A
,但它不可访问



一种解决方案是编写
::A而不是
A

虽然阿尔夫的答案是正确的,但我觉得可以把它说得更清楚一点(谁知道,也许会更让人困惑)。类的名称被注入到类本身的作用域中。正如他所提到的,只有在查找找到标识符的含义后,才会检查访问说明符。在问题代码中:

class A {};

class B : private A {

};

class C : public B {
public:
    void f() {
        A a; // This line causes error, but works when it is in main() function
    }

};

int main()
{
    C c;
    // A a; --> This line works
    return 0;
}
当处理
C::f
时,编译器会看到标识符
A
,并尝试解析它。它在
C
范围内搜索,但它不存在,它在层次结构中向上移动,在
B
中找不到它,但在基类型
A
中找到它(查找将非限定的
A
解析为
::A::A
)。在此上下文中,标识符
A
解析为我的基类B的基类A中的注入名称A,并检查访问说明符。编译器检查它是否可以访问我的基类B,然后检查它是否可以访问它的基类A,但由于
private
继承,此基类无法访问,并抱怨您无法访问
A
内部的嵌套名称
A


通过提供额外的限定条件
::A
,您正在指导查找。在本例中,它将在全局名称空间中找到类型
A
,该类型是完全可访问的,它将编译

@KarthikT,我看了看。这与试图访问类的私有成员的错误相同,尽管它抱怨
a::a
@KarthikT,类a不可见OK实际的错误消息是:错误:“类a”不可访问为什么代码在类C之外工作?你能解释一下吗?我很惊讶它会像那样“阻塞”
A
。我理解不能访问私有继承类的成员(如果它们存在的话)(这是私有继承的目的),但就像在函数中声明变量一样。。。似乎有点奇怪。@Anon:在C类之外,编译器没有在C类作用域中查找名称A。因此,它没有找到B::A.+1,因为需要花时间进行更彻底的解释。现在我该睡觉了还是去拿我的维萨卡来点温奇的《天空之子》?陛下
class A {};
class B : private A {};
struct C : public B {
    void f() {
        A a; // This line causes error, but works when it is in main() function
    }
};