"No appropriate default constructor available"在C++11

"No appropriate default constructor available" in C++11

本文关键字:C++11 available default No appropriate constructor      更新时间:2023-10-16

我正在尝试使用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.类,只使用初始化器来设置其数据。

您通常应该只初始化初始化器列表中的对象,而不是默认构造它们然后分配给它们。

然而,编译器没有理由接受用户编写的空默认构造函数而不是默认构造函数。

最可能的解释是SomeObj没有默认构造函数,或者可能是explicit

这很可能是指SomeObj的默认构造函数,而不是Foo。如果您没有在初始化列表中初始化您的成员数据,那么在输入构造函数主体之前,它们将被默认构造。你可能想这样做:

Foo(const SourceData& src) :
    fieldA {src.GetFieldA()}, fieldB {src.GetFieldB()}, myObj {src.GetObject()}
{ }