我的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’
在标记的行上。
答案 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支持的。