Ошибка: нет соответствующей функции для вызова... в операторе возврата
Я использую GCC7 на Qt 5.9.4 на openSUSE Leap 15.
У меня есть следующий класс:
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 ответ
Это ожидаемое поведение. Обратите внимание, что соответствующий конструктор объявлен как explicit
как
explicit ManSuppProps(ManSuppProps &manSuppProps);
А также return m_manSuppProps;
выполняет инициализацию копирования,
4) при возврате из функции, возвращающей по значению
И копия-инициализация не учитывает explicit
Конструкторы.
(акцент мой)
Если
T
является типом класса и CV-неквалифицированная версия типаother
являетсяT
или класс, полученный изT
неявные конструкторыT
рассматриваются и наилучшее соответствие выбирается по разрешению перегрузки. Затем вызывается конструктор для инициализации объекта.Инициализация копирования менее разрешительна, чем прямая инициализация: явные конструкторы не являются конвертирующими конструкторами и не рассматриваются для инициализации копирования.