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