以下代码无法使用 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 的问题?
您不能将数组存储在向量或任何其他容器中。要存储在容器中的元素的类型(称为容器的值类型)必须是可复制构造和可赋值的。数组都不是。
但是,您可以使用数组类模板,例如 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);
没有定义一个新的结构来保存 int[4]
不可能的。您必须定义或找到一个结构 ( std::array
, std::tr1::array
, boost::array
)。否则,此代码将永远无法编译。
见 23.1/3:
这些组件中存储的对象类型必须满足 CopyConstructible 类型 (20.1.3) 的要求,以及 Assignable 类型的附加要求。
因此,在 C++03 中,vector
要求包含的项目是可复制构造的,而 C 样式的数组则不是。错误消息是正确的,代码应该无法编译。只需在 C++11 中使用向量的向量、astruct
来包装您的数组或向量。std::array
请注意,我相信可复制构造的限制在 C++11 中已在容器范围内解除,我不确定是否/如何将 C 样式的数组存储在一个数组中,或者是否更明确地禁止它。