在PHP和C#中,可以在声明常量时初始化它们:
class Calendar3
{
const int value1 = 12;
const double value2 = 0.001;
}下面是函子的C++声明,它与另一个类一起用于比较两个数学向量:
struct equal_vec
{
bool operator() (const Vector3D& a, const Vector3D& b) const
{
Vector3D dist = b - a;
return ( dist.length2() <= tolerance );
}
static const float tolerance = 0.001;
};这段代码编译时没有g++问题。现在,在C++0x模式(-std=c++0x)中,g++编译器输出一条错误消息:
错误:非整型静态数据成员的类内初始化所需的“常数”
我知道我可以在类定义之外定义和初始化这个static const成员。此外,可以在构造函数的初始化程序列表中初始化非静态常量数据成员.
但是,是否有任何方法可以像在PHP或C#中一样初始化类声明中的常量?
更新
我使用static关键字只是因为可以在g++中的类声明中初始化这些常量。我只需要一种方法在类声明中初始化一个常量,不管它是否声明为static。
发布于 2012-02-09 09:35:27
在C++11中,可以在类声明中初始化非static数据成员、static constexpr数据成员和整数或枚举类型的static const数据成员。例如:
struct X {
int i=5;
const float f=3.12f;
static const int j=42;
static constexpr float g=9.5f;
};在这种情况下,类X的所有实例的X成员被编译器生成的构造函数初始化为5,而f成员被初始化为3.12。static const数据成员j初始化为42,static constexpr数据成员g初始化为9.5。
由于float和double不是整数或枚举类型的,这些成员必须是constexpr或非static,才能允许类定义中的初始化器。
在C++11之前,只有整数或枚举类型的static const数据成员才能在类定义中具有初始化器。
发布于 2012-02-08 19:48:54
初始化const类型以外的静态成员变量不是标准的C++以前的C++11。除非指定-pedantic选项,否则gcc编译器不会对此发出警告(但仍然会产生有用的代码)。然后,您应该得到一个类似于以下错误的错误:
const.cpp:3:36: error: floating-point literal cannot appear in a constant-expression
const.cpp:3:36: warning: ISO C++ forbids initialization of member constant ‘tolerance’ of non-integral type ‘const float’ [-pedantic]其原因是C++标准没有具体说明如何实现浮点,而是留给处理器处理。为了克服这一限制和其他限制,引入了constexpr。
发布于 2012-02-04 15:30:56
是。只需按错误说明添加constexpr关键字即可。
https://stackoverflow.com/questions/9141950
复制相似问题