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
构造函数试图默认构造 fooObject1
但 Foo
没有默认构造函数。
将Foo() = default;
添加到Foo
,它将编译。
不是声明被视为构造函数调用,而是成员fooObject1
需要在Bar
的构造函数中以某种方式初始化。所以编译器生成一些代码来调用默认构造函数Foo::Foo()
。但是那不存在,所以你得到一个错误。
一种解决方案是显式初始化成员初始化列表中的成员:
Bar(Foo fooObject2) : fooObject1(fooObject2) { ... }
另一个是为 Foo
.
提供默认构造函数
也许你想把fooObject2
复制到fooObject1
(不太清楚你想做什么)。如果是这样,那么这段代码就是你想要的
Bar(Foo fooObject2) : fooObject1(fooObject2) {
}
我正在尝试编写一个 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
构造函数试图默认构造 fooObject1
但 Foo
没有默认构造函数。
将Foo() = default;
添加到Foo
,它将编译。
不是声明被视为构造函数调用,而是成员fooObject1
需要在Bar
的构造函数中以某种方式初始化。所以编译器生成一些代码来调用默认构造函数Foo::Foo()
。但是那不存在,所以你得到一个错误。
一种解决方案是显式初始化成员初始化列表中的成员:
Bar(Foo fooObject2) : fooObject1(fooObject2) { ... }
另一个是为 Foo
.
也许你想把fooObject2
复制到fooObject1
(不太清楚你想做什么)。如果是这样,那么这段代码就是你想要的
Bar(Foo fooObject2) : fooObject1(fooObject2) {
}