the following code doesn\'t compile with gcc 4.7.0 (using std=c++11 -O3)
int n;
std::vector< int[4] > A;
A.resize(n);
the error messa
without defining a new struct to hold the int[4]
Impossible. You have to either define or find a struct (std::array
, std::tr1::array
, boost::array
). Else, this code will never compile.
You cannot store arrays in a vector or any other container. The type of the elements to be stored in a container (called the container's value type) must be both copy constructible and assignable. Arrays are neither.
You can, however, use an array class template, like the one provided by Boost, TR1, and C++0x:
std::vector<std::array<type, size> >
(You'll want to replace std::array with std::tr1::array to use the template included in C++ TR1, or boost::array to use the template from the Boost libraries. Alternatively, you can write your own; it's quite straightforward.)
@source By:James McNellis
So the code would look like:
int n;
std::vector<std::array<int,3>> A;
A.resize(n);
See 23.1/3:
The type of objects stored in these components must meet the requirements of CopyConstructible types (20.1.3), and the additional requirements of Assignable types.
Thus in C++03 vector
requires the contained items to be copy constructable, which C-style arrays are not. The error message is correct and the code should fail to compile. Just use a vector of vectors, a struct
to wrap your array, or vector of std::array
in C++11.
Note that I believe the copy-constructable restriction is lifted container-wide in C++11 and I'm not sure if/how you could store C-style arrays within one or if it's prohibited more explicitly.