5

以下代码无法使用 gcc 4.7.0 编译(使用 std=c++11 -O3)

int n;
std::vector< int[4] > A;
A.resize(n);

错误消息是长度,但最终

functional cast to array type ‘_ValueType {aka int[4]}‘

它是否正确?还是应该编译?更重要的是,如何避免这个问题?(没有定义一个新的结构来保存int[4]

编辑:

如何解决 C++98 的问题?

4

3 回答 3

9

您不能将数组存储在向量或任何其他容器中。要存储在容器中的元素的类型(称为容器的值类型)必须是可复制构造和可赋值的。数组都不是。

但是,您可以使用数组类模板,例如 Boost、TR1 和 C++0x 提供的模板:

std::vector<std::array<type, size> >

(您需要将 std::array 替换为 std::tr1::array 以使用 C++ TR1 中包含的模板,或者将 boost::array 替换为Boost 库中的模板。或者,您可以自己编写;这很简单。)

@来源:詹姆斯麦克内利斯

所以代码看起来像:

int n;
std::vector<std::array<int,3>> A;
A.resize(n);
于 2012-08-29T19:16:44.247 回答
4

没有定义一个新的结构来保存 int[4]

不可能的。您必须定义或找到一个结构 ( std::array, std::tr1::array, boost::array)。否则,此代码将永远无法编译。

于 2012-08-29T19:09:18.373 回答
2

见 23.1/3:

这些组件中存储的对象类型必须满足 CopyConstructible 类型 (20.1.3) 的要求,以及 Assignable 类型的附加要求。

因此,在 C++03 中,vector要求包含的项目是可复制构造的,而 C 样式的数组则不是。错误消息是正确的,代码应该无法编译。只需在 C++11 中使用向量的向量、astruct来包装您的数组或向量。std::array

请注意,我相信可复制构造的限制在 C++11 中已在容器范围内解除,我不确定是否/如何将 C 样式的数组存储在一个数组中,或者是否更明确地禁止它。

于 2012-08-29T19:17:49.487 回答