C++ 非常量数组声明的编译错误,C++;
奇怪,非常奇怪的案子。 考虑代码:C++ 非常量数组声明的编译错误,C++;,c++,c++11,multidimensional-array,compiler-errors,C++,C++11,Multidimensional Array,Compiler Errors,奇怪,非常奇怪的案子。 考虑代码: int n = 50; auto p1 = new double[n][5]; //OK auto p2 = new double[5][n]; //Error main.cpp:在函数“int main()”中: main.cpp:17:26:错误:新表达式中的数组大小必须为常量 自动p2=新的双精度[5][n]//错误 main.cpp:17:26:错误:“n”的值在常量表达式中不可用 main.cpp:15:8:注意:“int n”不是常量 有人能解释
int n = 50;
auto p1 = new double[n][5]; //OK
auto p2 = new double[5][n]; //Error
main.cpp:在函数“int main()”中:main.cpp:17:26:错误:新表达式中的数组大小必须为常量
自动p2=新的双精度[5][n]//错误 main.cpp:17:26:错误:“n”的值在常量表达式中不可用
main.cpp:15:8:注意:“int n”不是常量
有人能解释为什么第二个出现编译错误,但第一个运行得很好吗?使用
new double[n][5]
您正在分配n
类型的double[5]
值
使用新的双[5][n]
您正在分配5
。而且C++没有VLA,所以无效。< /P>
与以往一样,解决方案是使用:
std::vector p2(5,std::vector(n));
上面将
p2
定义为double
的向量。它将p2
构造为具有5个元素的大小,其中每个元素初始化为n
值的向量。将解释您的问题,附带说明您在新[]
表达式页面的“解释”部分下给出的确切示例(有趣!?)。见摘录:
如果类型是数组类型,则除第一个维度外的所有维度都必须指定为正整数常量表达式(直到C++14)转换为std::size_t类型的常量表达式(自C++14以来),但第一个维度可以是可转换为std::size_t的任何表达式。这是直接创建在运行时定义大小的数组的唯一方法,此类数组通常称为动态数组
“获取编译错误”,不会发布错误。它可能会帮助您查看。
std::vector<std::vector<double>> p2(5, std::vector<double>(n));