错误:调用' foo::foo() '没有匹配的函数

  • 本文关键字:foo 函数 调用 错误 c++
  • 更新时间 :
  • 英文 :


我有以下两个文件

foobar.h

#ifndef FOOBAR_H
#define FOOBAR_H
#include <cstring>
class Foo {
public:
int x;
Foo(int x);
};

class Bar {
public:
char* name;
Foo foo;
Bar(Foo foo);
};
#endif // FOOBAR_H

和foobar.cpp

#include "foobar.h"
Foo::Foo(int x) {
// Do something
}
Bar::Bar(Foo foo) {
// Do something
}

试图用g++ -c foobar.cpp -o foobar.o编译这些会导致以下错误:

foobar.cpp: In constructor ‘Bar::Bar(Foo)’:
foobar.cpp:9:17: error: no matching function for call to ‘Foo::Foo()’
Bar::Bar(Foo foo) {
^
foobar.cpp:5:1: note: candidate: ‘Foo::Foo(int)’
Foo::Foo(int x) {
^~~
foobar.cpp:5:1: note:   candidate expects 1 argument, 0 provided
In file included from foobar.cpp:1:
foobar.h:5:7: note: candidate: ‘constexpr Foo::Foo(const Foo&)’
class Foo {
^~~
foobar.h:5:7: note:   candidate expects 1 argument, 0 provided
foobar.h:5:7: note: candidate: ‘constexpr Foo::Foo(Foo&&)’
foobar.h:5:7: note:   candidate expects 1 argument, 0 provided

据我所知,g++的输出要求我有foo的默认构造函数。为什么?我希望传递一个foo对象到bar的构造函数,为什么它需要调用默认构造函数的任何地方?我不想有一个无参数的构造函数,因为我需要x有一个特定的用户定义的值。

您试图在这里默认构建Foo:

Bar::Bar(Foo foo) {
// the member variable `foo` would have been default constructed here
// Do something
}

但是Foo没有默认构造函数。一种可能的解决方案是在成员初始化列表中初始化它:

Bar::Bar(Foo foo) : foo(std::move(foo)) { // now uses the move constructor instead
// Do something
}

最新更新