Вы можете определить вложенный класс позже
class Outer {
static Outer* null() { return nullptr; }
template<typename T> ... SomeTemplateFunction() { ... }
class NestedClass;
};
class Outer::NestedClass {
std::vector<decltype(Outer::null()->SomeTemplateFunction<SomeOtherType>())> stuff;
};
Компилятор вправе стонать на вас. Для доступа члена класса (.
и ->
), в отличие от ::
, класс должен быть завершен. Так что, если это будет статическая функция, это будет хорошо, но, поскольку это нестатическая функция-член, она выдает ошибку.
Исключением из этого правила является случай, когда доступ к элементу происходит в конце указанного возвращаемого типа нестатической функции-члена при использовании this
(как правило, в промежутке после закрытия )
списка параметров и до начало тела функции, допускается это исключение из правила. В теле функции-члена внутреннего класса внешний класс считается завершенным, поэтому никаких исключений из правила больше не требуется).