[英]Qt “no matching function for call”
我有
no matching function for call to 'saveLine::saveLine()'
编译我的应用程序时出错。 实际上从未调用过该构造函数。
saveLine类定义:
class saveLine
{
public:
saveLine(QWidget *parent);
private:
QPushButton *selectButton, *acceptButton;
QLabel *filePath;
QLineEdit *allias;
};
saveLine用于另一个定义如下的类:
class MWindow : public QWidget
{
Q_OBJECT
public:
MWindow(QWidget *parent=0);
private:
saveLine line1;
};
错误指向MWindow构造函数实现
MWindow::MWindow(QWidget *parent):QWidget(parent)
{
this->setWindowTitle("Launcher");
this->resize(600,600);
}
我该怎么办? 我打算在向量中使用saveLine类,以在运行时创建行。
编辑:我错误地声明了line1,它应该显示为
saveLine *line1;
但是现在它又给出了另一个错误
ISO C++ forbids declaration of 'saveLine' with no type
和
expected ';' before '*' token
在这条线上。 似乎saveLine不再被视为类,怎么回事?
由于您为类saveLine
提供了用户声明的构造函数,因此编译器不会提供默认的构造函数。 您的构造函数不是默认的构造函数(它具有一个必需的参数),因此您不能默认构造类型为saveLine
的对象。
由于MWindow
类中有一个saveLine
对象, MWindow
需要在MWindow
构造函数的初始化列表中使用构造函数对其进行初始化:
MWindow::MWindow(QWidget *parent)
: QWidget(parent), line1(parent)
{
//...
}
(我假设父指针是您要传递的指针;如果您需要给它其他东西,那么请给它它所需要的东西)
另一个选择是为saveLine
的构造函数中的参数提供默认参数:
saveLine(QWidget *parent = 0);
这将允许不带任何参数调用该构造函数(并使它成为默认构造函数)。 这是否有意义取决于父指针是否确实是可选的。 显然,如果这样做,则在取消引用和使用指针之前,需要检查以确保指针不为null。
您必须在MWindow的构造函数中调用saveLine的构造函数,以为其提供所需的父对象。
采用:
MWindow::MWindow(QWidget *parent) : QWidget(parent), line1(parent)
{
this->setWindowTitle("Launcher");
this->resize(600,600);
}
但是现在它又给出了另一个错误
ISO C ++禁止声明无类型的“ saveLine”
您需要添加一个前向声明,以告知编译器saveLine类存在:
像这样:
//declare that there will be a class saveLine
class saveLine;
class MWindow : public QWidget
{
Q_OBJECT
public:
MWindow(QWidget *parent=0);
private:
saveLine *line1;
};
您在类声明中声明了saveLine的实例,而不是指向saveLine的指针。
您可以将MWindow中的引用更改为
saveLine* line1;
要么
您可以这样实现:
MWindow::MWindow(QWidget *parent):QWidget(parent), line1(parent)
{
this->setWindowTitle("Launcher");
this->resize(600,600);
}
尝试添加class saveLine;
在class MWindow
线的上方。 当saveLine类和MWindow类的.h文件相互包含(直接或间接)时,通常会发生这种情况。 例如,请参阅http://www.allegro.cc/forums/thread/594307的前几篇文章
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.