对参数化构造函数的显式调用会引发错误

时间:2014-09-28 15:44:32

标签: c++ constructor

在创建对象时,我们可以对构造函数进行隐式或显式调用

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)'

我错过了什么。

2 个答案:

答案 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)创建了一个临时对象,只能使用常量引用进行绑定。

实际上你不需要为这个简单的类显式定义复制构造函数。