"No appropriate default constructor available"在C++11
"No appropriate default constructor available" in C++11
我正在尝试使用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()}
{ }
相关文章:
- MSVC是否支持C++11样式的属性而不是__declspec
- 创建LinkedList退出,返回代码为-11(SIGSEGV)
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 如何将模板转换为C++11之前的模板
- c++11评估顺序(未定义的行为)
- C++中的VLA,扩展名为std=C++11
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- "类模板示例<int>;"语句对 C++11 是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 如何使用lock_guard在c++11中实现scoped_lock功能
- C++11 中不同类型的对象的 std::array 的替代方案
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 为什么我的C++代码中出现'Segmentation Fault: 11'行?
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- STLPort using C++11
- Qt 5.11.2 (Clang 8.0 (Apple), 64 位), 找不到 QJSEngine 文件
- 在 C++11 中,如何查找并返回以给定字符串开头的字符串向量中的所有项?
- "No appropriate default constructor available"在C++11