1

我想知道为什么会发生这样的错误。

no matching function for call to 'Foo::Foo()'

在复制构造函数的代码中?假设 Foo 只是一个具有普通字段的对象(没有动态分配的内存等),并且它定义的唯一构造函数是一个带有一个参数的构造函数。

我什至不知道需要考虑构造函数。如果代码说类似

bar = thing.bar; //

并且 bar 是 Foo 类型的,具有上述规范,它不应该只是生成一个浅拷贝并完成它吗?为什么需要调用默认构造函数?

4

3 回答 3

8

如果您不定义构造函数,编译器将生成一个默认构造函数,但是如果您定义了一个构造函数(如复制构造函数),编译器将不会生成默认构造函数,因此您也需要定义该构造函数。

于 2009-12-20T05:44:38.793 回答
3

听起来您已经定义了复制构造函数而没有定义任何其他构造函数。

一旦显式声明了构造函数,编译器就不再为您提供默认构造函数。因此,您不再具有首先构造类对象的机制(因此无法复制它)。

于 2009-12-20T05:46:04.343 回答
1

如果,正如你所说,你正在做“类似

bar = thing.bar;

它可能在您的类的复制 ctor的主体bar中——因此该字段首先使用其类的默认 ctor 进行初始化,然后对该语句使用该类的赋值运算符。如果bar' 的类只有一个复制 ctor,没有默认 ctor,则需要在类的复制 ctor 打开之前bar(thing.bar)添加一个子句并删除该分配(无论如何通常是个好主意,但在“无默认 ctor”条件下是强制性的) .{

于 2009-12-20T05:49:26.707 回答