奇怪的错误C2131:表达式在VC 2015中没有评估为常量

时间:2015-11-10 07:54:42

标签: c++ visual-studio-2015

// foo.hpp file 
class foo 
    { 
    public: 
      static const int nmConst; 
      int arr[nmConst]; // line 7 
    };  
// foo.cpp file 
    const int foo::nmConst= 5; 

编译VC 2015返回错误:

  

1> foo.h(7):错误C2131:表达式未评估为常数
  1 GT; 1> foo.h(7):失败是由非常数参数或
引起的   参考非常数符号1> 1> foo.h(7):注意:见用法   ' nmConst'

为什么呢? nmConst是静态常量,其值在* .cpp文件中定义。

1 个答案:

答案 0 :(得分:5)

可以使用static const int成员作为数组大小,但您必须在.hpp文件中的类中定义此成员,如下所示:

class foo
{
public:

    static const int nmConst = 10;
    int arr[nmConst];

};

这样可行。

P.S。关于它背后的逻辑,我相信编译器一旦遇到类声明就想知道数组成员的大小。如果你在类中保留static const int成员未定义,编译器将会理解你正在尝试定义可变长度数组并报告错误(它不会等到你是否真的在某处定义了nmconst )。