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

这一生的挚爱 提交于 2019-11-29 14:12:11
heretolearn

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);

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.

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.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!