表达式必须在c ++中具有常量值错误

时间:2011-09-20 15:51:45

标签: c++ arrays visual-studio vector

  

可能重复:
  Is there a way to initialize an array with non-constant variables? (C++)

我有以下代码:

vector<vector<vec2>> vinciP;
    int myLines = -1;
    myLines = drawPolyLineFile("vinci.dat", vinciP);
    if (myLines > -1)
    {
        cout << "\n\nSUCCESS";
        vec2 vPoints[myLines];
        for (int i = 0; i < NumPoints; ++i)
        {
            vPoints[i] = vinciP[0][i];
        }
    }

我在线路上遇到错误&#39; vec2 vPoints [myLines];&#39;表示表达式必须具有常量值。我不明白为什么我会收到此错误,有什么帮助?

是因为myLines可能是否定的? IDK的。

5 个答案:

答案 0 :(得分:13)

vec2 vPoints[myLines];

由于myLines不是 const 表达式((这意味着它在编译时不可知),所以上面的代码声明了一个不允许的变长数组C ++。只有C99具有此功能。您的编译器可能将此作为扩展(但不是标准C ++)。

这种共同问题的解决方案是:使用std::vector<T>作为:

std::vector<vec2> vPoints(myLines);

现在应该可以了。

答案 1 :(得分:5)

是因为myLines可能是否定的?
不,这是因为myLines不是编译时常量。

<强>解释

vec2 vPoints[myLines];

创建一个可变长度的数组,其中myLines值将在运行时确定。 C ++中不允许使用 Variable length arrays 。这是C99中引入的一个功能,而C ++标准不支持它。一些C ++编译器支持它作为扩展,但它仍然是非标准的符合。

对于C ++,数组的大小应该在编译时知道,因此必须是编译时常量。 myLines不是编译时常量,因此也就是错误。

您应该使用 std :: vector

答案 2 :(得分:1)

vec2 vPoints[myLines];

数组大小必须是编译时常量。 myLines不是编译时常量。相反,使用 new 分配内存,甚至更好地使用std::vector

答案 3 :(得分:1)

C ++没有可变长度数组。必须在编译时确定数组的大小。 myLines的值仅在运行时已知,因此不起作用。

要使数组的大小仅在运行时已知,请使用std::vector

std::vector<vec2> vPoints(myLines);

答案 4 :(得分:1)

您收到该错误,因为静态数组需要静态(常量)大小。由于vPoints中的组件数量是动态的,因此请考虑使用动态数组。或者更好地坚持使用vector