Как я должен инициализировать скобками 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 } } };