B
является внутренним типом класса A
. Когда компилятор встречает B
в определении B A::foo() { ... }
, он еще не видел A::foo()
, чтобы установить, что B
следует искать в области действия A
, а не как какой-то другой B
, который может быть уже в сфере из других. Таким образом, вы должны явно квалифицировать B
как A::B
на этом этапе определения.
Это не тот случай, если вы вместо этого используете B
:
void A::foo(B &b) { ... }
Или как тип возврата для auto
возвращаемого значения:
auto A::foo() -> B { ... }
В обоих случаях сначала встречается A::foo()
, чтобы установить область, необходимую компилятору для самостоятельного определения, что B
относится к A::B
.