错误:没有匹配函数可用于在返回语句处调用...

时间:2018-09-11 09:12:42

标签: c++ qt initialization return explicit

我在openSUSE Leap 15的Qt 5.9.4上使用GCC7。

我有以下课程:

class ManSuppProps : public QObject
{
    Q_OBJECT

public:
    explicit ManSuppProps(QString parentName);
    explicit ManSuppProps(){}
    explicit ManSuppProps(const ManSuppProps &manSuppProps);
    explicit ManSuppProps(ManSuppProps &manSuppProps);
    ~ManSuppProps();

private:
    QVector3D m_suppPos;
    QString m_suppParentName;

}

具有针对构造函数的以下实现:

ManSuppProps::ManSuppProps(QString parentName)
    : QObject()
    , m_suppPos(QVector3D(0, 0, 0))
    , m_suppParentName(parentName)
{
    qDebug()<<"Constructing ManSuppProps object ...";
}

ManSuppProps::ManSuppProps(const ManSuppProps &manSuppProps)
    : QObject()
    , m_suppPos(manSuppProps.getSuppPos())
    , m_suppParentName(manSuppProps.getSuppParentName())
{
}

ManSuppProps::ManSuppProps(ManSuppProps &manSuppProps)
    : QObject()
    , m_suppPos(manSuppProps.getSuppPos())
    , m_suppParentName(manSuppProps.getSuppParentName())
{

}

ManSuppProps::~ManSuppProps(){}

我收到以下错误:

  

错误:没有匹配的函数可以调用“ ManSuppProps :: ManSuppProps(ManSuppProps&)”

在另一个具有类ManSuppProps的成员的方法中:

ManSuppProps EditorScene::manSuppProps()
{
    return m_manSuppProps; // error is thrown here
}

考虑到我拥有所有构造函数,我不明白为什么会收到错误。谁能帮忙。

1 个答案:

答案 0 :(得分:7)

这是预期的行为。请注意,适当的构造函数声明为explicit

explicit ManSuppProps(ManSuppProps &manSuppProps);

return m_manSuppProps;执行copy initialization

  

4)从按值返回的函数返回时

并且复制初始化不考虑explicit构造函数。

(重点是我的)

  

如果T是类类型,并且other类型的简历不合格版本是T或从T派生的类,则非检查T的显式构造函数,并通过重载分辨率选择最佳匹配。然后调用构造函数以初始化对象。

     

复制初始化比直接初始化要宽松:显式构造函数不会转换构造函数,因此不会考虑进行复制初始化