Эта часть проблемы c - это B::createA
.
Здесь вы «входите в» тип B
, чтобы извлечь его функцию-член createA
. Для этого вам необходимо знать полный тип B
. В противном случае, как компилятор узнает, где найти эту функцию-член, и существует ли она вообще? В конце концов, на этом этапе вы не выполняете никаких вызовов функций, поэтому здесь нечего решать. Но это все равно будет проблемой: c, так как я мог бы написать вместо B::thisfunctiondoesnotexist
, и компилятор тоже должен был бы это принять. Поэтому язык предпочитает требовать, чтобы полный тип был известен заранее всякий раз, когда вы используете ::
для извлечения некоторых из его внутренностей.
Один простой способ обойти это ограничение (если, например, вам нужно избежать cycli c зависимостей между классами) заключается в том, чтобы поместить функциональность createA
в бесплатную функцию вместо функции-члена. Бесплатная функция, основанная как на A
, так и на B
, все еще может быть объявлена, если типы были только объявлены вперед в этот момент, но не определены.