为什么这个说没有已知的转换从“nullptr_t到const”?

时间:2014-09-05 17:32:45

标签: c++ qt pointers

最初项目编译并运行良好。然后,在没有修改setuptab.h|.cpp文件的情况下,我试图避免创建setuptab的新实例,因此我尝试将其传递过来。

错误

No matching constructor for initialization of 'Ps::MainView'
        m_mainView(*new MainView(nullptr), m_setupTab)
                        ^        ~~~~~~~

Candidate constructor (the implicit copy constructor) not viable: no known conversion from 'nullptr_t' to 'const Ps::MainView' for 1st argument
    class MainView : public QMainWindow
          ^

这是一个小项目,我有以下文件:

main.cpp
startup.h|.cpp

View/mainview.h|.cpp
View/setuptab.h|.cpp

我的main.cpp只是:

#include <QApplication>
#include "startup.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Ps::Startup start_up;
    start_up.show();

    return a.exec();
}

Startup.cpp

#include "startup.h"
#include "View/mainview.h"
#include "View/setuptab.h"

namespace Ps
{
    Startup::Startup() :
        QObject(nullptr),
        m_setupTab(*new SetupTab(nullptr)),
        m_mainView(*new MainView(nullptr), m_setupTab) //THIS IS WHERE THE ERROR COMES FROM

    {
    }

    void Startup::show() const{
        m_mainView.show();

    }
}

然后创建了以下头文件,如果你想要相应的.cpp,请告诉我。

startup.h:

#pragma once
#include <QObject>

namespace Ps{

    class MainView;
    class SetupTab;

    class Startup final : public QObject
    {
        Q_OBJECT
    public:
        explicit Startup();
        void show() const ;

    private:
        SetupTab& m_setupTab;
        MainView& m_mainView;

        explicit Startup(const Startup& rhs) = delete;
        Startup& operator= (const Startup& rhs) = delete;
    };
}

mainview.h

#ifndef MAINVIEW_H
#define MAINVIEW_H

#include <QMainWindow>

namespace Ui {
    class MainView;
}

namespace Ps {

    class SetupTab;

    class MainView : public QMainWindow //corresponding candidate error
    {
        Q_OBJECT

    public:
        explicit MainView(QWidget *parent, Ps::SetupTab &setup);
        ~MainView();

    private:
        SetupTab& m_setupTab;
        Ui::MainView *ui;
    };
}

#endif // MAINVIEW_H

setuptab.h

#ifndef SETUPTAB_H
#define SETUPTAB_H

#include <QWidget>

namespace Ui {
    class SetupTab;
}

namespace Ps {
    class SetupTab : public QWidget
    {
        Q_OBJECT

    public:
        explicit SetupTab(QWidget *parent = 0);
        ~SetupTab();

    private:
        Ui::SetupTab *ui;
    };
}

#endif // SETUPTAB_H

1 个答案:

答案 0 :(得分:5)

MainView构造函数有两个参数:

explicit MainView(QWidget *parent, Ps::SetupTab &setup);

你只用一个来打电话:

m_mainView(*new MainView(nullptr), m_setupTab)
                         ^^^^^^^

看起来你只是把括号放在了错误的地方:

m_mainView(*new MainView(nullptr, m_setupTab))

给出错误消息是因为唯一具有单个参数的构造函数是隐式声明的复制构造函数,因此编译器建议将其作为最可能的候选者。