vec template clase arreglo c++ c++11 std-pair stdarray list-initialization

template - vector de string c++



¿Cómo debo armar-inicializar un std:: array of std:: pairs? (2)

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

Error VS2013:

error C2440: ''inicializando'': no ​​se puede convertir de ''int'' a ''std :: pair'' Ningún constructor pudo tomar el tipo de fuente, o la resolución de sobrecarga del constructor fue ambigua`

¿Qué estoy haciendo mal?


Añadir otro par de tirantes.

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

std::array<T, N> es una clase agregada que contiene un miembro de tipo T[N] . Por lo general, puede inicializarlo de la misma manera que lo haría con una matriz T[N] simple, pero cuando se trata de un tipo de elemento no agregado, es posible que deba ser más explícito.


std::array es un agregado. Solo tiene un miembro de datos: una matriz del tipo especificado de la especialización std::array . Según el estándar C ++. (8.5.1 Agregados)

2 Cuando un agregado se inicializa mediante una lista de inicializadores, como se especifica en 8.5.4, los elementos de la lista de inicializadores se toman como inicializadores para los miembros del agregado, al aumentar el subíndice o el orden de los miembros.

Así que este disco

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

tiene más inicializadores que miembros de datos en std :: array.

El miembro de datos de std::array es a su vez un agregado. Tienes que proporcionarle una lista de inicialización.

Así se verá el disco

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

Para que quede más claro puedes imaginar la inicialización de la siguiente manera.

std::array<std::pair<int, int>, 2> ids = { /* an initializer for data member of the array */ };

Como el miembro de datos es agregado, entonces tienes que escribir

std::array<std::pair<int, int>, 2> ids = { { /* initializers for the aggregate data member*/ } };

Y por ultimo

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