最初项目编译并运行良好。然后,在没有修改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
#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
答案 0 :(得分:5)
MainView
构造函数有两个参数:
explicit MainView(QWidget *parent, Ps::SetupTab &setup);
你只用一个来打电话:
m_mainView(*new MainView(nullptr), m_setupTab)
^^^^^^^
看起来你只是把括号放在了错误的地方:
m_mainView(*new MainView(nullptr, m_setupTab))
给出错误消息是因为唯一具有单个参数的构造函数是隐式声明的复制构造函数,因此编译器建议将其作为最可能的候选者。