Как я должен инициализировать скобками std :: массив std :: пар?

std::array<std::pair<int, int>, 2> ids = { { 0, 1 }, { 1, 2 } };

Ошибка VS2013:

ошибка C2440: ‘initializing’: невозможно преобразовать из ‘int’ в ‘std :: pair’ Ни один конструктор не может принять тип источника, или разрешение перегрузки конструктора было неоднозначным`

Что я делаю неправильно?

16

Решение

Добавьте еще пару скобок.

std::array<std::pair<int, int>, 2> ids = { { { 0, 1 }, { 1, 2 } } };

std::array<T, N> является агрегатным классом, содержащим член типа T[N], Обычно вы можете инициализировать это так же, как обычную T[N] массив, но когда вы имеете дело с неагрегированным типом элемента, вам может потребоваться быть более явным.

18

Другие решения

std::array это совокупность. Он имеет только один элемент данных — массив указанного типа std::array специализация. Согласно стандарту C ++. (8.5.1 Агрегаты)

2 Когда агрегат инициализируется списком инициализаторов, как
указанные в 8.5.4, элементы списка инициализатора принимаются как
инициализаторы для элементов совокупности, в возрастающем индексе
или заказ участника

Итак, эта запись

std::array<std::pair<int, int>, 2> ids = { { 0, 1 }, { 1, 2 } };

имеет больше инициализаторов, чем элементы данных в массиве std ::.

Член данных 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 } } };
14

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector