Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的静态常量双重初始化+;_C++_Initialization_Double_Constant Expression - Fatal编程技术网

C++ C+中的静态常量双重初始化+;

C++ C+中的静态常量双重初始化+;,c++,initialization,double,constant-expression,C++,Initialization,Double,Constant Expression,我有一些用“较新”的编译器构建的遗留代码,遇到了一些对我来说毫无意义的静态const double初始化错误。以下是我所拥有的: //header.h class myclass { private: static const double foo = 3.1415; static const double bar = 12345.0 * foo; }; 使用gcc版本4.3.3编译此代码时,我看到以下错误: foo cannot appear in a co

我有一些用“较新”的编译器构建的遗留代码,遇到了一些对我来说毫无意义的静态const double初始化错误。以下是我所拥有的:

//header.h

class myclass
{
   private:
      static const double foo = 3.1415;
      static const double bar = 12345.0 * foo;
};
使用gcc版本4.3.3编译此代码时,我看到以下错误:

 foo cannot appear in a constant-expression

我已经揭穿了这一点,认为这不是静态初始化顺序的失败,因为我相信内在数据类型有一个定义良好的初始化顺序——特别是当它们生活在同一个类中时。作为一个测试,我已经尝试了
static\u cast
表达式,但这会产生另一个错误,即在常量表达式中只允许整数类型强制转换。

static
constexpr
的数据成员只能在类定义中声明为整数或枚举类型时直接初始化。所有其他数据类型必须在源文件中给出单独的定义,并且只能在该定义处进行初始化。因此,将类定义更改为:

class myclass
{
   private:
      static const double foo;
      static const double bar;
};
并将这些定义引入到一个
.cpp
文件中:

const double myclass::foo = 3.1415;
const double myclass::bar = 12345.0 * foo;

如果您有足够的现代C++访问权限,您可以选择将类声明更改为<代码> CONTXPRP</代码>:

class myclass
{
   private:
      static constexpr double foo = 3.1415;
      static constexpr double bar = 12345.0 * foo;
};

这样,它们就不需要在源文件中定义,除非您将它们用作对象而不是值(例如,如果您使用它们的地址)。但是,GCC4.3.3不支持C++11的这一部分。

改为
constepr
。@Ron“GCC4.3.3版”-我认为这行不通。GCC4.3.3有一个C++11的版本,其中
constepr
属于C++11。你能用最近的gcc版本吗?不幸的是不能。我对这些编撰者有点“官僚主义”。这就是为什么我用“更新”这个词的原因。谢谢!这是一个非常清楚的解释。我想我现在可以找到解决办法了。