我在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
}
考虑到我拥有所有构造函数,我不明白为什么会收到错误。谁能帮忙。
答案 0 :(得分:7)
这是预期的行为。请注意,适当的构造函数声明为explicit
为
explicit ManSuppProps(ManSuppProps &manSuppProps);
return m_manSuppProps;
执行copy initialization,
4)从按值返回的函数返回时
并且复制初始化不考虑explicit
构造函数。
(重点是我的)
如果
T
是类类型,并且other
类型的简历不合格版本是T
或从T
派生的类,则非检查T
的显式构造函数,并通过重载分辨率选择最佳匹配。然后调用构造函数以初始化对象。复制初始化比直接初始化要宽松:显式构造函数不会转换构造函数,因此不会考虑进行复制初始化。