Наследование структуры, приводящее к ошибке неагрегированного типа при инициализации stati c - PullRequest
1 голос
/ 14 апреля 2020

В настоящее время у меня есть следующее:

struct MsgHeader_t
{
    int   a;
    float b;
};

, которое инициализирует const по умолчанию как

const MsgHeader_t default = { 0, 0.0f };

, который работал нормально. Теперь я должен расширить его, и он ДОЛЖЕН наследоваться от другой структуры. Так что теперь у меня есть.

struct MsgId_t
{
    unsigned int id;
};

struct MsgHeader_t : public MsgId_t
{
    int   a;
    float b;
};

Но теперь, когда я пытаюсь инициализировать это const по умолчанию (const MsgHeader_t aMessage = { 0, 0, 0.0f };), я получаю

error: braces around initializer for non-aggregate type 'const MsgHeader_t'

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Если у вас есть наследование, ваш класс больше не может быть агрегатным типом. Из этого черновика стандарта C ++ (мой жирный курсив):

8.5.1 Агрегаты

1 An aggregate - это массив или класс (раздел 9) без предоставленных пользователем конструкторов (12.1), без закрытых или защищенных не статичных c членов данных (пункт 11), без базовых классов (пункт 10), без виртуальных функций (10.3).

0 голосов
/ 14 апреля 2020

Обратите внимание, что начиная с C ++ 17, вы можете сделать, как вы ожидаете:

  • const MsgHeader_t aMessage = { 0, 0, 0.0f };. Демо
  • или более правильно const MsgHeader_t aMessage = { {0}, 0, 0.0f };. Демо
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...