please see the following code
struct A { using type = int; };
struct B : private A {};
struct C : B { using base_type = A; };
All of gcc 6.1, clang 3.8, and msvc 2015 update 3 refuse to compile this, as A
is not an accessible name inside C
since A
is a private base of B
. It seems that gcc thinks A
in using base_type = A
refers to the default constructor of A
. msvc and clang seem not.
Perhaps the compilation error is due to the injection of names triggered by inheritances (because modifying using base_type = A
into using base_type = ::A
make all the compilers work fine), but I want to know if this weird error is what the standard says.
More concretely,
A::type
, A
is just a class name (although gcc misinterprets it as a function name) which is introduced to C
not inside A
nor B
. Why this name is considered private to B
?According to the rule of unqualified name lookup:
(emphasis mine)
For an unqualified name, that is a name that does not appear to the right of a scope resolution operator ::, name lookup examines the scopes as described below, until it finds at least one declaration of any kind, at which time the lookup stops and no further scopes are examined.
So the name A
will be found firstly at the base class scope, the name in the global namespace won't be considered here. After that, access right checking is performed and then compile failed.
And ::A
specifies the name in global scope and solves the issue, which making it a qualified name lookup.