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

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 &amp;),当您没有其他构造函数时,您已禁用默认构造函数,该默认构造函数为您隐式放置在类中,因为编译器都知道,您可能不需要默认构造函数,所以它无法做出假设 (see here)。

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

B()

在 C++11 中,这很好用:

B() = default;

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

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

【讨论】:

以上是关于没有匹配的初始化构造函数的主要内容,如果未能解决你的问题,请参考以下文章

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

C++ 使用继承时没有匹配的构造函数

没有用于使用 VSTGUI 初始化“AEffGUIEditor”的匹配构造函数

C++ 错误:没有用于初始化的匹配构造函数

C++ 错误:没有用于初始化的匹配构造函数

如何修复 Xcode 中的这 15 个错误? ...语义问题和初始化没有匹配的构造函数?