compiler error with C++ std::vector of array

后端 未结 3 475
轻奢々
轻奢々 2020-12-21 00:27

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

相关标签:
3条回答
  • 2020-12-21 00:39

    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.

    0 讨论(0)
  • 2020-12-21 00:40

    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);
    
    0 讨论(0)
  • 2020-12-21 00:47

    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.

    0 讨论(0)
提交回复
热议问题