Possible Duplicate:
c++ why initializer_list behavior for std::vector and std::array are different
I defined simple 2D array (3X2):
std::array<std::array<int,3>,2> a { {1,2,3}, {4,5,6} };
I was surprised this initialization does not work, with gcc4.5 error: too many initializers for 'std::array<std::array<int, 3u>, 2u>'
Why can't I use this syntax?
I found workarounds, one very funny with extra braces, but just wonder why the first, easiest approach is not valid?
Workarounds:
// 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, thanks to KerrekSB and comments I get the difference. So it seems that there is too little braces in my example, like in this C example:
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<T, N>
is an aggregate that contains a C array. To initialize it, you need outer braces for the class itself and inner braces for the C array:
std::array<int, 3> a1 = { { 1, 2, 3 } };
Applying this logic to a 2D array gives this:
std::array<std::array<int, 3>, 2> a2 { { { {1, 2, 3} }, { { 4, 5, 6} } } }; // ^ ^ ^ ^ ^ ^ // | | | | | | // | +-|-+------------|-+ // +-|-+-|------------+---- C++ class braces // | | // +---+--- member C array braces
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With