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 !
};
这个错误对我来说似乎不合理。如果我们可以在全局范围内使用简单的B*
那么为什么不在其私有派生类中呢? g++ demo
我们不会尝试将DD*
转换为B*
,这是语言规则禁止的this,this,this是相关问题) 。
请注意,如果我将B* foo()
更改为int foo()
,情况就会好转。
答案 0 :(得分:7)
显然编译器认为B
指的是B
的私有构造函数而不是类型。
符合条件的B
显然修复了错误:
class B* foo () { return 0; }
或者这个:
::B* foo () { return 0; }
我不知道为什么会这样,但也许这会有所帮助。
更新:也许它与标准的11.2.4有关?唯一的问题是我的标准不足以完全理解它。
(对不起图像,复制/粘贴对我不起作用)
答案 1 :(得分:7)
快速查找标准中的注入类名:
§11.1[class.access.spec]
5 / [注意:在派生类中,基类名称的查找将找到inject-class-name而不是基类的名称在宣布它的范围内。 inject-name的名称可能比声明它的作用域中的基类名称更不易访问。 -end note ]
[例如:
class A { }; class B : private A { }; class C : public B { A *p; // error: injected-class-name A is inaccessible ::A *q; // OK };
-end example]
我相信这与你的榜样非常接近;)
注意clang 3.0的堆栈,稍微更明确一点:
$ clang++ -fsyntax-only test.cpp
test.cpp:6:5: error: 'B' is a private member of 'B'
B* foo () { return 0; } // error: ‘struct B B::B’ is inaccessible !
^
test.cpp:2:12: note: constrained by private inheritance here
struct D : private B {
^~~~~~~~~
test.cpp:1:8: note: member is declared here
struct B {};
^
1 error generated.
我们在此处看到B
是通过D
访问的,而不是直接在全局命名空间中获取。
答案 2 :(得分:1)
我最好的猜测是它不被禁止,C ++根本没有在该语句中看到B类型,或者更好的是标签B
没有任何意义。
关于
的一些好读物