Possible Duplicate:
c++ why initializer_list behavior for std::vector and std::array are different¿Por qué no se puede inicializar de forma simple (con llaves) 2D std :: array?
que definen simple matriz 2D (3X2):
std::array<std::array<int,3>,2> a {
{1,2,3},
{4,5,6}
};
Me sorprendió esta inicialización no funciona, con el error gcc4.5: too many initializers for 'std::array<std::array<int, 3u>, 2u>'
Por qué no puedo utilizar este ¿sintaxis?
Encontré soluciones, una muy divertida con llaves adicionales, pero me pregunto por qué el primer enfoque más fácil no es válido.
Soluciones:
// EXTRA BRACES
std::array<std::array<int,3>,2> a {{
{1,2,3},
{4,5,6}
}};
// EXPLICIT CASTING
std::array<std::array<int,3>,2> a {
std::array<int,3>{1,2,3},
std::array<int,3>{4,5,6}
};
[ACTUALIZACIÓN]
Ok, gracias a los comentarios KerrekSB y me sale la diferencia. Así que parece que hay muy poca llaves en mi ejemplo, como en este ejemplo C:
struct B {
int array[3];
};
struct A {
B array[2];
};
B b = {{1,2,3}};
A a = {{
{{1,2,3}},
{{4,5,6}}
}};
'std :: array' es un agregado. – chris
También espero que esto funcione. Por cierto, otra solución es omitir las llaves internas, aunque produce advertencias en gcc 4.8. – juanchopanza
El caso multidimensional no es diferente del caso unidimensional, aunque el soporte del compilador puede variar. 'std :: array a {1,2};' está mal formado también (gcc 4.7.2 aceptará incorrectamente dicho código; clang 3.1 no lo hará). Ver el duplicado al que he vinculado anteriormente. La respuesta corta es: este es un defecto conocido en el estándar de lenguaje C++ 11. –