struct B {};
struct D : private B {
B* fun () { return new D; } // ok
}
struct DD : public D {
B* foo () { return 0; } // error: ‘struct B B::B’ is inaccessible !
};
Run Code Online (Sandbox Code Playgroud)
这个错误对我来说似乎不合理.如果我们可以B*在全局范围内使用简单,那么为什么不在其私有派生类中呢?g ++演示.
我们是不是要转换DD*到B*,这是由语言规则(禁止这个,这个,这个是相关的问题).
需要注意的是,如果我改变B* foo()到int foo(),事情的罚款.
此代码示例将描述我发现非直观的语言功能.
class A {
public:
A() {}
};
class B: private A
{
public:
B() {}
};
class C: public B
{
public:
C() {}
void ProcessA(A* a) {
}
};
int main() {
C c;
}
Run Code Online (Sandbox Code Playgroud)
在Mac上使用Apple LLVM 4.2版编译此代码会产生一个
test.cc:16: error: ‘class A’ is inaccessible
test.cc:16: error: within this context
Run Code Online (Sandbox Code Playgroud)
更换void ProcessA(A* a)与void ProcessA(::A* a)将使建立,但我不明白为什么我要在这里使用绝对类名.它是一种语言功能,可以避免某些错误,或者它只是一个黑暗的C++语法角,就像要求> >在与其他模板参数化的模板中的尖括号()之间放置空格.谢谢!