Понадобилось мне давеча сделать нечто хитрое с помощью взаимно-рекурсивных классов.
Опуская непринципиальные для обсуждения детали, я написал нечто вроде
#include
#include
struct Foo;
template struct BarT { T foo1, foo2; }; // !!!
using Bar = BarT; // !!!
struct Foo { std::vector bar; };
// Демонстрация, что компилируется и работает
int main() {
Bar bar;
std::cout << sizeof(Foo) << ' ' << sizeof(Bar) << '\n';
}
А теперь внимание, вопрос: какого бы, собственно, рожна нас в XXI веке заставляют прыгать через обруч, вместо того, чтобы просто писать, взамен отмеченного !!!,
struct Bar { Foo foo1, foo2; };
Что мешает компилятору, при виде недоопределенных классов внутри определяемого класса, автоматически делать вид, что это был темплейт?