Известно, что не может быть членом типа, который вы определяете:
class Foo {
Foo member;
};
Причина в том, что это бесконечно рекурсивный, бесконечно большой объект. Однако мы можем иметь статические члены:
class Foo {
static Foo member;
};
Мы можем это сделать, потому что Foo действует как пространство имен; экземпляры Foo не содержат .member, поэтому нет бесконечной ссылки. Другими словами, .member принадлежит классу, а не экземпляру. То, что я хотел бы сделать, очень похоже:
class Foo {
class Bar {
Foo member;
};
};
И снова Foo действует как пространство имен. Экземпляры Foo фактически пусты. Мне нужно было бы создать нестатическое поле Bar Foo::bar;, чтобы начать получать макеты. К сожалению, мои компиляторы не согласны (например GCC):
<source>:3:14: error: field 'member' has incomplete type 'Foo'
Foo member;
^~~~~~
По какой технической причине это не разрешено?