Известно, что не может быть членом типа, который вы определяете:
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;
^~~~~~
По какой технической причине это не разрешено?