Как инициализировать `std::map‹std::string, CodeInfo›`, используя инициализацию списка?

У меня есть карта с ключом string и значением struct, я не знаю, почему я не могу создать экземпляр объекта с помощью список инициализаторов:

#include <string>
#include <map>    
using namespace std;

struct CodeInfo
{
    int _level = 0;
    bool _reactive;
};
typedef map<string, CodeInfo> CodeInfos; // Key is code name

int main()
{
    CodeInfos codes = { {"BARECODE", { 0, true }}, {"BARECODE2", { 0, false }} };

    return 0;
}

Кажется, это просто, но я не могу понять, почему я получаю следующую ошибку:

In function 'int main()':    
24:80: error: could not convert '{{"BARECODE", {0, true}}, {"BARECODE2", {0, false}}}' from '<brace-enclosed initializer list>' to 'CodeInfos {aka std::map<std::basic_string<char>, CodeInfo>}'

Я использую компилятор g++ (GCC) 4.9.1 20140922 (Red Hat 4.9.1-10) с С++ 11.


person RedPaladin    schedule 10.12.2018    source источник


Ответы (1)


Причина в том, что CodeInfo не является совокупным, потому что вы инициализируете один из членов данных (_level = 0) непосредственно в определении класса.

Удаление инициализации по умолчанию этого участника будет работать. с С++11. см. здесь

Прочитайте этот пост для получения дополнительной информации об агрегатах: Что такое агрегаты и POD и в чем их особенность?

person JeJo    schedule 10.12.2018
comment
Это эквивалентно предоставлению конструктора по умолчанию для класса и, следовательно, не будет работать с инициализацией списка. Нет, не совсем. - person cpplearner; 10.12.2018
comment
И мы обычно не вызываем int _level = 0; прямую инициализацию. В стандарте используется термин инициализатор члена по умолчанию. - person cpplearner; 10.12.2018
comment
@cpplearner Спасибо, что указали правильное слово. А что касается конструктора по умолчанию, который я нашел в другом ответе. Не могли бы вы указать мне, в чем именно разница.? - person JeJo; 10.12.2018