標準での注入されたクラス名の簡単なルックアップは次のようになります。
§11.1 [class.access.spec]
5/ [注:派生クラスでは、基本クラス名のルックアップは、それが宣言されたスコープ内の基本クラスの名前ではなく、注入されたクラス名を見つけます。注入されたクラス名は、それが宣言されたスコープ内の基本クラスの名前よりもアクセスしにくい場合があります。—終わりのメモ]
[ 例:
class A { };
class B : private A { };
class C : public B {
A *p; // error: injected-class-name A is inaccessible
::A *q; // OK
};
—終わりの例]
これはあなたの例に不気味に近いと思います;)
もう少し明示的な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