std::array<std::pair<int, int>, 2> ids = { { 0, 1 }, { 1, 2 } };
Ошибка VS2013:
ошибка C2440: ‘initializing’: невозможно преобразовать из ‘int’ в ‘std :: pair’ Ни один конструктор не может принять тип источника, или разрешение перегрузки конструктора было неоднозначным`
Что я делаю неправильно?
Добавьте еще пару скобок.
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 } } };