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
}
};