【问题标题】:cannot appear in a constant expression不能出现在常量表达式中
【发布时间】:2013-12-01 14:44:25
【问题描述】:

在以下 c++ 程序中:

class matrix {
public:
  int n;
  double **x;

  matrix(int n) : n(n) { 
    x=new double[n][n]; 
    for (int i=0;i<n;i++)
    { 
       for(int j=0;j<n;j++)
       {
         x[i][j]=0;
       }
    }
 }
 ...

我收到以下错误:“'n' 不能出现在常量表达式中”。 由于我对 cpp 比较陌生,所以我真的不知道为什么会发生这个错误(特别是因为我对一个名为 vector 的类做了几乎完全相同的事情,而且根本没有问题)以及如何修复它。 非常感谢任何帮助。

【问题讨论】:

    标签: c++ constructor constant-expression constructor-overloading


    【解决方案1】:

    在这个表达式中

    x=new double[n][n];
    

    除了最左边的所有维度都应该是常量表达式。

    正确的做法是

    x = new double *[n];
    for ( int i = 0; i < n; i++ ) x[i] = new double[n];
    
    for (int i=0;i<n;i++)
    { 
       for(int j=0;j<n;j++)
       {
         x[i][j]=0;
       }
    }
    

    或者,如果您的编译器支持 C++ 2011,则无需在循环中显式初始化即可更简单地完成

    x = new double *[n];
    for ( int i = 0; i < n; i++ ) x[i] = new double[n] {};
    

    【讨论】:

    • 还有别忘了释放内存
    • 在 C++11 中:auto arr = new double[n][n]();
    • 对于一个矩阵,你应该使用一个指针数组,而是使用一段连续的内存。
    • @P0W 你错了。自动 arr = new double[n][n]();在 C++11 中无效,因为最右边的表达式必须是常量表达式。
    • @VladfromMoscow 我是不是说了什么,应该的,我只是写了可以使用该语句来完成,当然它必须是const 意图是显示() 用于初始化没有for循环
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多