В C ++ область видимости класса особенная.Любое объявление, которое распространяется до или после конца определения класса, автоматически распространяется на области, определенные его определениями членов (3.3.6 [basic.scope.class]).
Это означает, что в первом случаеи первое объявление struct A
, и полное определение struct A
видны в теле B
и его конструкторе.
Это не относится к области имен, поэтому во втором случае a.member
в конструкторе B
ошибка, потому что определение struct A
еще не видно.