没有匹配的初始化构造函数
Posted
技术标签:
【中文标题】没有匹配的初始化构造函数【英文标题】:No Matching Constructor For Initialization 【发布时间】:2012-10-17 00:28:09 【问题描述】:我只是应该习惯基本的复制构造函数。
我假设我正确放置了复制构造函数。
但是当我尝试编译时,我不断收到错误“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;
【问题讨论】:
A 或 B 都没有默认构造函数——一旦你声明了构造函数——编译器就不会生成默认构造函数。B(int)
构造函数可以充当B
的默认构造函数,如果你给valueb
参数一个默认值,从而允许B b1;
语句工作。但是A
没有B
的构造函数可以调用的构造函数,所以B
仍然根本无法构造。
【参考方案1】:
通过声明B(int)
和B(const B &)
,当您没有其他构造函数时,您已禁用默认构造函数,该默认构造函数为您隐式放置在类中,因为编译器都知道,您可能不需要默认构造函数,所以它无法做出假设 (see here)。
将以下内容添加到B
,记住用它初始化基和成员:
B()
在 C++11 中,这很好用:
B() = default;
这将允许B
在声明B b1;
时使用默认构造函数
A
也是如此。您有一个复制构造函数,因此不再为您隐式放置任何默认构造函数。
【讨论】:
以上是关于没有匹配的初始化构造函数的主要内容,如果未能解决你的问题,请参考以下文章