Это работает:
struct B {
B() : a(5) { }
static void A() { }
::A a;
};
Поскольку вы использовали A
в качестве имени элемента в B
, определение этого элемента затеняет тип A
из внешнего пространства имен. Используя ::
, вы можете попасть в это пространство имен.
Это поведение указано в (черновом) стандарте как:
3.3.7 (1) «Имя может быть скрыто явным объявлением того же имени во вложенной декларативной области» (определение struct B
, которое вложено в пространство имен, где struct A
также определен).
Внимательно прочитайте введение к главе 3 «Основные понятия» для дальнейшего разъяснения. В частности, в этом разделе указывается, что
3 (7) Два имени совпадают, если
- это идентификаторы, составленные из одной и той же последовательности символов; или
- это имена перегруженных операторных функций, сформированных одним и тем же оператором; или
- это имена пользовательских функций преобразования, сформированных с одним и тем же типом.
Обратите внимание, что в этом последнем определении не проводится различия между типами и членами класса, поэтому применяется правило 3.3.7 (1) сокрытия имен.