C++编译报错no matching function for call to ‘Foo::Foo()’原因是什么?
错误原因
- C++类的构造执行流程中,成员变量的初始化会先于构造函数体内的代码执行。你在Bar类中定义了Foo类型的成员
foo,但编写Bar::Bar(Foo foo)构造函数时,没有在初始化列表中显式初始化该成员,编译器会自动尝试调用Foo的无参默认构造函数来初始化foo成员。 - 你自定义了
Foo::Foo(int x)构造函数后,编译器不会再自动生成默认无参构造函数,因此找不到匹配的构造函数触发编译错误。你传入Bar构造函数的Foo参数,只会在进入构造函数体后才可用,无法覆盖成员foo的提前初始化逻辑。
解决方法
你不需要新增Foo的无参构造函数,只需要修改Bar的构造函数,在初始化列表中显式初始化foo成员即可:
// 方式1:移动构造,性能更优 Bar::Bar(Foo foo) : foo(std::move(foo)) { // 原有构造逻辑保持不变 }
也可以选择直接拷贝传参:
// 方式2:拷贝构造 Bar::Bar(const Foo& foo) : foo(foo) { // 原有构造逻辑保持不变 }
以上两种写法都会直接调用Foo的移动构造/拷贝构造函数来初始化成员foo,不会触发对默认无参构造函数的调用,同时满足Foo的x成员必须由外部指定的要求。
内容的提问来源于stack exchange,提问作者karmacoma
相关产品推荐
相关产品推荐

