如何定义静态const成员?

时间:2012-05-31 13:16:38

标签: c++ g++ const static-members

我的Test班级有一个const static个子类型的成员。我通常将此const static成员定义如下。

class Test 
{
public:
    class Dummy {};

private:
    static Dummy const dummy;

};

Test::Dummy const Test::dummy;             // ERROR HERE

int main() 
{
    return 0;
}

使用gcc-4.6编译此源时,它不会出错并正确编译。

使用gcc-4.4编译同一个源时,会出现以下错误: error: uninitialized const ‘Test::dummy’ 在标记的行上。

  • 还有另一种方法来定义这个静态const成员变量吗?
  • 这是gcc-4.4的限制吗?
  • 有解决方法吗?

4 个答案:

答案 0 :(得分:6)

说:

Test::Dummy const Test::dummy = { };

答案 1 :(得分:2)

请参阅http://gcc.gnu.org/wiki/VerboseDiagnostics#uninitialized_const(其中提供了对标准的相关参考)以及GCC 4.6 release notes所说的

  

在4.6.0和4.6.1中,G ++不再允许对const限定类型的对象进行默认初始化,除非该类型具有用户声明的默认构造函数。在4.6.2中,G ++实现了DR 253的建议解析,因此如果初始化所有子对象,则允许默认初始化。可以通过提供初始化程序来修复无法编译的代码,例如

struct A { A(); };
struct B : A { int i; };
const B b = B();
  

使用-fpermissive允许旧的,不符合要求的行为。

答案 2 :(得分:1)

您还可以将默认ctor添加到class Dummy

class Dummy { public: Dummy(){} };
第4行

编辑: 似乎gcc 4.4无法为类Dummy生成默认ctor。因此,上面直接克服了这个编译器错误。

答案 3 :(得分:0)

使用gcc 4.4,使用

Test::Dummy const Test::dummy = Test::Dummy;

使用支持C ++ 11的编译器,您可以使用统一的初始化语法:

Test::Dummy const Test::dummy = { };

但我不认为这是由gcc 4.4支持的。