Это well-known that one cannot haveчлен типа вы определяете:Почему внутренние термины класса * не могут использовать своих родителей?
class Foo {
Foo member;
};
Причина заключается в том, что это бесконечно рекурсивным, бесконечно большой объект. Тем не менее, мы можем иметь статические членов:
class Foo {
static Foo member;
};
Мы можем сделать это, потому что Foo
действует как пространство имен; экземпляры Foo
не содержат .member
, поэтому нет бесконечной ссылки. Иными словами, .member
относится к классу, а не к экземпляру. То, что я хотел бы сделать, это очень похоже:
class Foo {
class Bar {
Foo member;
};
};
Еще раз, Foo
действует как пространство имен. Экземпляры Foo
фактически пусты. Мне нужно было бы создать нестатическое поле Bar Foo::bar;
, чтобы начать получать макеты. К сожалению, мои компиляторы не согласен (e.g. GCC):
<source>:3:14: error: field 'member' has incomplete type 'Foo'
Foo member;
^~~~~~
Для того, что техническая причина это не разрешено?
_acting as namespace_ - Нет, это не что иное, как пространство имен. Пространства имен не хранят данные. 'static Foo' и' Foo member' делает –
, как вы можете сделать со статикой, вы можете со ссылками, и вот что происходит с конструктором копирования. – Raindrop7
Я смущен, почему вы хотели бы сделать это в первую очередь. Я мог бы понять член как 'Foo *', но не предложили бы какие-либо из предложенных нестатических объявлений 'sizeof (Foo)' бесконечно? Я не вижу, как это возможно даже для компиляции –