Как я должен скопировать инициализацию std:: array из std:: pairs?
std::array<std::pair<int, int>, 2> ids = { { 0, 1 }, { 1, 2 } };
Ошибка VS2013:
ошибка C2440: 'initializing': невозможно преобразовать из 'int' в 'std:: pair' Нет конструктора, который мог бы взять тип источника, или разрешение перегрузки конструктора было неоднозначным`
Что я делаю неправильно?
Ответы
Ответ 1
Добавьте еще одну пару фигурных скобок.
std::array<std::pair<int, int>, 2> ids = { { { 0, 1 }, { 1, 2 } } };
std::array<T, N>
- это совокупный класс, содержащий член типа T[N]
. Обычно вы можете инициализировать так же, как и обычный массив T[N]
, но когда вы имеете дело с типом неагрегационного элемента, вам может потребоваться более явное.
Ответ 2
std::array
является совокупностью. Он имеет только один элемент данных - массив указанного типа специализации std::array
. Согласно стандарту С++. (8.5.1 Агрегаты)
2 Когда агрегат инициализируется списком инициализаторов, как указанных в 8.5.4, элементы списка инициализаторов берутся как инициализаторы для членов агрегата, увеличивая индекс или порядок членов
Итак, эта запись
std::array<std::pair<int, int>, 2> ids = { { 0, 1 }, { 1, 2 } };
имеет больше инициализаторов, тогда есть элементы данных в std:: array.
Элемент данных std::array
в свою очередь является совокупностью. Вы должны указать для него список инициализаторов.
Итак, запись будет выглядеть как
std::array<std::pair<int, int>, 2> ids = { { { 0, 1 }, { 1, 2 } } };
Ибо было бы более понятно, что вы можете представить себе инициализацию следующим образом:
std::array<std::pair<int, int>, 2> ids = { /* an initializer for data member of the array */ };
Поскольку элемент данных является агрегированным, вы должны написать
std::array<std::pair<int, int>, 2> ids = { { /* initializers for the aggregate data member*/ } };
И наконец
std::array<std::pair<int, int>, 2> ids = { { { 0, 1 }, { 1, 2 } } };