对构造函数的调用不能出现在常量表达式中

Ale*_*ros 2 c++

我很抱歉我的新手问题,但我对C++知之甚少.任何人都可以回答为什么我在编译下面的代码时得到错误"错误:对构造函数的调用不能出现在常量表达式中";

class EliminationWeight
{
 public:
    typedef double Type;
    static const Type MAX_VALUE = __DBL_MAX__;
    static const Type MIN_VALUE = -__DBL_MAX__;
};
Run Code Online (Sandbox Code Playgroud)

我使用Ubuntu 12.04和随附的gcc.这不是我的代码,我知道这个代码可能100%正常工作(可能在旧版本的gcc或其他编译器中).有没有快速解决方法?

在此先感谢您的回答,这实际上是我第一次问SO.

vit*_*aut 6

Call to a constructor cannot appear in a constant-expression是一个GCC错误消息,这对我来说真的没有意义.例如,Clang接受您的代码并发出一些警告:

test.cpp:31:23: warning: in-class initializer for static data member of type
      'const Type' (aka 'const double') is a GNU extension [-Wgnu]
    static const Type MAX_VALUE = __DBL_MAX__;
                      ^           ~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

无论如何,在类体中初始化double是非标准的.你应该单独进行初始化:

class EliminationWeight
{
 public:
    typedef double Type;
    static const Type MAX_VALUE;
    static const Type MIN_VALUE;
};
Run Code Online (Sandbox Code Playgroud)

然后在一个源文件(不是头文件)中:

const EliminationWeight::Type EliminationWeight::MAX_VALUE = __DBL_MAX__;
const EliminationWeight::Type EliminationWeight::MIN_VALUE = -__DBL_MAX__;
Run Code Online (Sandbox Code Playgroud)

通常,您只能在类体中初始化具有整数类型的静态成员变量,尽管这已在C++ 0x11中进行了扩展.另请参见在C++中的类声明中初始化const成员

  • ...并且该警告告诉您代码是非标准的,并且仅由于扩展而起作用.问题是只能以这种方式初始化整数类型.它不是任何方式,形状或形式的"虫子". (4认同)