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

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

Ошибка VS2013:

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

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

2 ответа

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

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

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

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 } } };
Другие вопросы по тегам