我正在尝试使用C ++ 11初始化程序来避免编写不必要的默认构造函数。但是,我收到错误“没有适当的默认构造函数”,并且不明白为什么。
以下是我的代码的简化版本:
struct Foo
{
double fieldA { 0.0 }; // Initializer
short fieldB { 0 }; // Initializer
SomeObj myObj; // Use default ctor of SomeObj
// Foo() = default; // this line doesn't help!
Foo(const SourceData& src)
{ // Error: No Appropriate Default Ctor!
fieldA = src.GetFieldA();
fieldB = src.GetFieldB();
myObj = src.GetObject();
}
};
我认为没有任何理由说编译器生成的默认构造函数不可用而且不起作用。即使我“鼓励”编译器生成默认构造函数,我仍然会得到相同的消息。
如果我真的写出了默认的ctor,那么它确实有效。但这违背了使用初始化程序代替构造函数的目的,对吧?
<小时/> 编辑有些人认为问题出在SomeObj及其构造函数上 SomeObj也是P.O.D. class,只使用初始值设定项来设置数据。
答案 0 :(得分:1)
您通常应该初始化初始化列表中的对象,而不是默认构造它们,然后分配给它们。
但是,编译器没有理由接受用户编写的空默认构造函数而非默认构造函数。
最可能的解释是SomeObj
没有默认构造函数,或者可能是explicit
。
答案 1 :(得分:0)
这很可能是指SomeObj
而不是Foo
的默认构造函数。如果您没有在初始化列表中初始化您的成员数据,那么在输入构造函数体之前,它们将是默认构造的。你可能想这样做:
Foo(const SourceData& src) :
fieldA {src.GetFieldA()}, fieldB {src.GetFieldB()}, myObj {src.GetObject()}
{ }