如果您编译下面的代码失败,则说B类无法访问,因为它被用作成员函数func的参数。这是为什么?
注意:如果D2没有从D1继承,那么错误就会消失,所以从D2继承使得B无法访问。
namespace myns {
class B {};
}
using namespace myns;
class D1 : B {};
class D2 : D1 {
void func(B b) {}
};
答案 0 :(得分:5)
名称查找找到D2::D1::B
,而不是myns::B
。在查找名称后,将执行访问检查,并发现D2::D1::B
是私有的。
命名空间是一个红色的鲱鱼:如果在全局命名空间中定义B
,则会观察到完全相同的结果。
答案 1 :(得分:4)
您需要添加::
运算符。查找是找到注入类名而不是myns::B
。
class D2 : D1 {
void func(::B b) {}
};
11.1p5
5 [注意:在派生类中,将查找基类名称 找到inject-class-name而不是基类的名称 声明的范围。注入类名可能是 比在其范围内的基类名称更不易访问 它被宣布了。 - 尾注] [例如:
class A { };
class B : private A { };
class C : public B {
A *p; // error: injected-class-name A is inaccessible
::A *q; // OK
};
答案 2 :(得分:0)
继承类/结构时的默认访问说明符是“私有”,所以问题是:
class D1 : B {};
class D2 : D1 {};
添加关键字“public”和瞧。
namespace myns {
class B {};
}
using namespace myns;
class D1 : public B {};
class D2 : public D1 {
void func(B b) {}
};
int main() {
D2 d();
}