没有用于初始化的匹配构造函数

No Matching Constructor For Initialization

本文关键字:构造函数 初始化 用于      更新时间:2023-10-16

我应该已经习惯了基本的复制构造函数。

我认为我正确地放置了复制构造函数。

但当我尝试编译时,我不断收到错误"没有匹配的构造函数用于初始化B">

我有点困惑。

class A {
int valuea;
public:     
A(const A&); // copy constructor
int getValuea() const { return valuea; }
void setValuea(int x) { valuea = x; }
};
class B : public A {
int valueb;
public:
B(int valueb);
B(const B&); // copy constructor
int getValueb() const { return valueb; }
void setValueb(int x) { valueb = x; }
};
int main () {
B b1;
b1.setValuea(5);
b1.setValueb(10);
B b2(b1);
cout << "b2.valuea="  << b2.getValuea() << "b2.valueb="  << b2.getValueb() << endl;
return 0;
}

通过声明B(int)B(const B &),当您没有其他构造函数时,您禁用了隐式放置在类中的默认构造函数,因为据编译器所知,您可能不想要默认构造函数,因此它无法进行假设(请参阅此处)。

将以下内容添加到B中,记住用它初始化基础和成员:

B(){}

在C++11中,这一点运行良好:

B() = default;

这将允许B在声明B b1;时使用默认构造函数

A也是如此。您有一个复制构造函数,因此不再为您隐式放置任何默认构造函数。