MinGW 将 class 中对象的第二次声明视为构造函数

MinGW treats second declaration of an object in a class as a Constructor

我正在尝试编写一个 class(我们称它为 Bar),它将另一个 class(Foo)的对象作为构造函数的参数.我还有一个 class Foo 的对象声明为 Bar 的属性。这是一些示例代码:

#include <iostream>

class Foo {
public:
    Foo(int i) {
        std::cout << i;
    }
};

class Bar {
private:
    Foo fooObject1;

public:
    Bar(Foo fooObject2) {

    }
};

int main() {

}

出于某种原因,g++ (MinGW) 似乎将 Foo 对象的第二个声明(作为 Bar 构造函数的参数)视为构造函数。尝试编译该代码示例会出现以下错误:

test.cpp: In constructor 'Bar::Bar(Foo)':
test.cpp:15:25: error: no matching function for call to 'Foo::Foo()'
   15 |     Bar(Foo fooObject2) {
      |                         ^
test.cpp:5:5: note: candidate: 'Foo::Foo(int)'
    5 |     Foo(int i) {
      |     ^~~
test.cpp:5:5: note:   candidate expects 1 argument, 0 provided
test.cpp:3:7: note: candidate: 'constexpr Foo::Foo(const Foo&)'
    3 | class Foo {
      |       ^~~
test.cpp:3:7: note:   candidate expects 1 argument, 0 provided
test.cpp:3:7: note: candidate: 'constexpr Foo::Foo(Foo&&)'
test.cpp:3:7: note:   candidate expects 1 argument, 0 provided

是什么原因造成的,我该如何防止这个错误?

Bar 构造函数试图默认构造 fooObject1Foo 没有默认构造函数。

Foo() = default;添加到Foo,它将编译。

不是声明被视为构造函数调用,而是成员fooObject1需要在Bar的构造函数中以某种方式初始化。所以编译器生成一些代码来调用默认构造函数Foo::Foo()。但是那不存在,所以你得到一个错误。

一种解决方案是显式初始化成员初始化列表中的成员:

Bar(Foo fooObject2) : fooObject1(fooObject2) { ... }

另一个是为 Foo.

提供默认构造函数

也许你想把fooObject2复制到fooObject1(不太清楚你想做什么)。如果是这样,那么这段代码就是你想要的

Bar(Foo fooObject2) : fooObject1(fooObject2) {

}