ошибка: нет соответствующей функции для вызова ... в операторе возврата - PullRequest
0 голосов
/ 11 сентября 2018

Я использую 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 Ответ

0 голосов
/ 11 сентября 2018

Это ожидаемое поведение. Обратите внимание, что соответствующий конструктор объявлен как explicit как

explicit ManSuppProps(ManSuppProps &manSuppProps);

И return m_manSuppProps; выполняет копирование инициализации ,

4) при возврате из функции, которая возвращает значение

И при инициализации копирования не учитываются explicit конструкторы.

(акцент мой)

Если T является типом класса и cv-неквалифицированная версия типа other равна T или класс, полученный из T, , то неявные конструкторы T осмотрено и выбрано наилучшее совпадение по разрешению перегрузки . Затем вызывается конструктор для инициализации объекта.

Копирование-инициализация менее допустимо, чем прямая инициализация: явные конструкторы не являются конвертирующими конструкторами и не рассматриваются для копирования-инициализации .

...