我想知道为什么会发生这样的错误。
no matching function for call to 'Foo::Foo()'
在复制构造函数的代码中?假设 Foo 只是一个具有普通字段的对象(没有动态分配的内存等),并且它定义的唯一构造函数是一个带有一个参数的构造函数。
我什至不知道需要考虑构造函数。如果代码说类似
bar = thing.bar; //
并且 bar 是 Foo 类型的,具有上述规范,它不应该只是生成一个浅拷贝并完成它吗?为什么需要调用默认构造函数?
我想知道为什么会发生这样的错误。
no matching function for call to 'Foo::Foo()'
在复制构造函数的代码中?假设 Foo 只是一个具有普通字段的对象(没有动态分配的内存等),并且它定义的唯一构造函数是一个带有一个参数的构造函数。
我什至不知道需要考虑构造函数。如果代码说类似
bar = thing.bar; //
并且 bar 是 Foo 类型的,具有上述规范,它不应该只是生成一个浅拷贝并完成它吗?为什么需要调用默认构造函数?
如果您不定义构造函数,编译器将生成一个默认构造函数,但是如果您定义了一个构造函数(如复制构造函数),编译器将不会生成默认构造函数,因此您也需要定义该构造函数。
听起来您已经定义了复制构造函数而没有定义任何其他构造函数。
一旦显式声明了构造函数,编译器就不再为您提供默认构造函数。因此,您不再具有首先构造类对象的机制(因此无法复制它)。
如果,正如你所说,你正在做“类似
bar = thing.bar;
它可能在您的类的复制 ctor的主体bar
中——因此该字段首先使用其类的默认 ctor 进行初始化,然后对该语句使用该类的赋值运算符。如果bar
' 的类只有一个复制 ctor,没有默认 ctor,则需要在类的复制 ctor 打开之前bar(thing.bar)
添加一个子句并删除该分配(无论如何通常是个好主意,但在“无默认 ctor”条件下是强制性的) .{