2012-10-11 15 views
16

Possible Duplicate:
c++ why initializer_list behavior for std::vector and std::array are differentDlaczego nie można łatwo zainicjować (z nawiasami klamrowymi) 2D std :: array?

zdefiniowałem prostą tablicę 2D (3x2):

std::array<std::array<int,3>,2> a { 
    {1,2,3}, 
    {4,5,6} 
    }; 

Byłem zaskoczony tym inicjalizacji nie działa, z błędem gcc4.5: too many initializers for 'std::array<std::array<int, 3u>, 2u>'

Dlaczego nie mogę korzystać z tego składnia?

Znalazłem obejścia, jeden bardzo zabawny z dodatkowymi nawiasami klamrowymi, ale tylko zastanawiam się, dlaczego pierwsze, najłatwiejsze podejście nie jest ważne?

Obejścia:

// 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} 
    }; 

[UPDATE]

Ok, dzięki KerrekSB i komentarze uzyskać różnicę. Tak więc wydaje się, że jest tam zbyt mało szelki w moim przykładzie, jak w tym przykładzie 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' jest agregat. – chris

+0

Spodziewam się, że to zadziała. BTW innym obejściem jest pominięcie wewnętrznych nawiasów klamrowych, chociaż generuje ostrzeżenia na gcc 4.8. – juanchopanza

+0

Wielowymiarowy przypadek nie różni się od przypadku jednowymiarowego, chociaż obsługa kompilatora może być różna. 'std :: array a {1,2};' też jest źle sformułowane (gcc 4.7.2 błędnie zaakceptuje taki kod, clang 3.1 nie będzie). Zobacz duplikat, do którego dołączyłem powyżej. Krótka odpowiedź brzmi: jest to znana wada w standardzie języka C++ 11. –

Odpowiedz

30

std::array<T, N> jest agregatem że zawiera tablica C. Aby zainicjować go, trzeba zewnętrzne szelki dla samej klasy i wewnętrzne szelki dla macierzy C:

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

Stosując tę ​​logikę do tablicy 2D daje to:

std::array<std::array<int, 3>, 2> a2 { { { {1, 2, 3} }, { { 4, 5, 6} } } }; 
//         ^^^^   ^^ 
//         | | | |   | | 
//         | +-|-+------------|-+ 
//         +-|-+-|------------+---- C++ class braces 
//          | | 
//          +---+--- member C array braces 
+2

Ale to działa dobrze: 'std :: array a1 {1, 2, 3};'? – PiotrNycz

+2

@PiotrNycz: Tylko jeśli jesteś bardzo zaniedbany i ignorujesz wszystkie ostrzeżenia. Mój kompilator mówi: "ostrzeżenie: brak nawiasów wokół inicjalizatora dla" std :: array :: value_type [3] {vel int [3]} '[-Wmissing-braces] '. –

+0

Rozumiem, dziękuję. Dodałem do mojego pytania przykład z C. – PiotrNycz

Powiązane problemy