Mr_*_*1mm 1 c++ double initialization constant-expression
我有一些遗留代码,我正在用"更新"的编译器构建并运行一些对我来说没有意义的静态const double初始化错误.这就是我所拥有的:
//header.h
class myclass
{
private:
static const double foo = 3.1415;
static const double bar = 12345.0 * foo;
};
Run Code Online (Sandbox Code Playgroud)
用gcc版本4.3.3编译此代码时 - 我看到以下错误:
foo cannot appear in a constant-expression
Run Code Online (Sandbox Code Playgroud)
我已经将其解释为不是静态初始化顺序惨败,因为我相信内部数据类型具有良好定义的初始化顺序 - 尤其是当它们位于同一个类中时.作为测试,我已经尝试static_cast< double >过表达式,但是这会产生另一个错误,指出在const表达式中只允许使用整数类型转换.
static如果数据成员是constexpr整数或枚举类型,那么它们只能在类定义中的声明中直接初始化.所有其他数据类型必须在源文件中给出单独的定义,并且只能在该定义中初始化.所以将您的类定义更改为:
class myclass
{
private:
static const double foo;
static const double bar;
};
Run Code Online (Sandbox Code Playgroud)
并将这些定义引入到一个.cpp文件中:
const double myclass::foo = 3.1415;
const double myclass::bar = 12345.0 * foo;
Run Code Online (Sandbox Code Playgroud)
如果您可以访问足够现代的C++,那么您可以选择将类内声明更改为constexpr:
class myclass
{
private:
static constexpr double foo = 3.1415;
static constexpr double bar = 12345.0 * foo;
};
Run Code Online (Sandbox Code Playgroud)
这样,除非您将它们用作对象而不是值(例如,如果您使用其地址),它们将不需要源文件中的定义.但是,GCC 4.3.3不支持C++ 11的那部分.
| 归档时间: |
|
| 查看次数: |
506 次 |
| 最近记录: |