在创建对象时,我们可以对构造函数进行隐式或显式调用
Base obj;
Base obj = Base(1,2);
这些对象创建方法都运行正常,直到我在代码中包含复制构造函数。 这是代码片段。
#include<iostream>
using namespace std;
class Base {
public:
Base(int x, int y) {}
Base() {}
Base(Base& o){}
private:
int a;
int b;
};
int main() {
Base obj = Base(10,20); /*This line throws error after including copy Ctor*/
Base obj2 = obj;
}
我正在使用Linux g ++编译器。 错误:没有匹配函数来调用'Base :: Base(Base)'
我错过了什么。
答案 0 :(得分:4)
复制构造函数应该是以下形式,以便使用Base(10,20)
Base(const Base& o){}
// ~~~~ notice `const`
或者,您可以将移动构造函数与C ++ 11一起使用,以允许临时对象
Base(Base &&o){}
答案 1 :(得分:2)
你有两种可能性。要么像
那样更改复制构造函数的声明Base( const Base &o){}
或添加移动构造函数
Base(Base &&o){}
例如
#include<iostream>
using namespace std;
class Base {
public:
Base(int x, int y) {}
Base() {}
Base(Base& o){}
Base( Base && ){}
private:
int a;
int b;
};
int main() {
Base obj = Base(10,20); /*This line throws error after including copy Ctor*/
Base obj2 = obj;
}
代码的问题在于表达式Base(10,20)
创建了一个临时对象,只能使用常量引用进行绑定。
实际上你不需要为这个简单的类显式定义复制构造函数。