c++ - read - ¿Por qué no se puede inicializar(con llaves) 2D std:: array?
javascript multidimensional array undefined (1)
std::array<T, N>
es un agregado que contiene una matriz en C. Para inicializarlo, necesita llaves externas para la propia clase y llaves internas para la matriz C:
std::array<int, 3> a1 = { { 1, 2, 3 } };
La aplicación de esta lógica a una matriz 2D da esto:
std::array<std::array<int, 3>, 2> a2 { { { {1, 2, 3} }, { { 4, 5, 6} } } };
// ^ ^ ^ ^ ^ ^
// | | | | | |
// | +-|-+------------|-+
// +-|-+-|------------+---- C++ class braces
// | |
// +---+--- member C array braces
Posible duplicado:
c ++ por qué el comportamiento de initializer_list para std :: vector y std :: array son diferentes
Definí una matriz 2D simple (3X2):
std::array<std::array<int,3>,2> a {
{1,2,3},
{4,5,6}
};
Me sorprendió que esta inicialización no funcione, con gcc4.5 error: too many initializers for ''std::array<std::array<int, 3u>, 2u>''
¿Por qué no puedo usar esta sintaxis?
Encontré soluciones, una muy divertida con aparatos 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}
};
[ACTUALIZAR]
Ok, gracias a KerrekSB y los comentarios me dan la diferencia. Así que parece que hay muy pocas 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}}
}};