f = [](...) { бла; бла; бла; Incomplete_S::foo(bar); }
}
То есть, в дефолтном инициализаторе переменной класса в теле лямбды используется статический член из неполного типа.
Единственный способ сделать, чтобы это работало, это сделать какую-нибудь возможно inline функцию, объявление которой написать в S.hpp в S, а определение в S.cpp, где Incomplete_S уже известен?
хотелось бы default member initializer не в хедере, а в .cpp иметь, какую-нибудь такую фичу языка.
я сделал
// S.hpp
struct S {
static inline std::function<...> init_f();
std::function<...> f = init_f(); }
}
// S.cpp
#include "Incomplete_S.hpp"
inline std::function<...> S::init_f() {
return [](...) { бла; бла; бла; Incomplete_S::foo(bar) };
}
и оно работает. но выглядит уродливо
Унести в шаблон. Который удовлетворитеся, что Incomplete это typename, не важно какой. А когда шаблон будет инстанцироваться, нужен будет уже полноценно определённый тип.
Обсуждают сегодня