2012-10-11 15 views
16

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}} 
}}; 
+0

'std :: array' es un agregado. – chris

+0

También espero que esto funcione. Por cierto, otra solución es omitir las llaves internas, aunque produce advertencias en gcc 4.8. – juanchopanza

+0

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. –

Respuesta

30

std::array<T, N> es un agregado que contiene una matriz C. Para inicializar la tarjeta, deberá apoyos exteriores para la clase en sí y los apoyos internos para la matriz C:

std::array<int, 3> a1 = { { 1, 2, 3 } }; 

Aplicando 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 
+2

Pero esto funciona bien: 'std :: array a1 {1, 2, 3};'? – PiotrNycz

+2

@PiotrNycz: solo si eres muy descuidado e ignora todas las advertencias. Mi compilador dice, 'advertencia: faltan llaves alrededor del inicializador para 'std :: array :: value_type [3] {aka int [3]}' [-Wmissing-llaves]'. –

+0

Lo entiendo ahora, gracias. Agregué a mi ejemplo de pregunta con C. – PiotrNycz

Cuestiones relacionadas