Qt“没有匹配的呼叫功能”

时间:2010-04-20 15:42:28

标签: c++ qt compiler-errors

我有

no matching function for call to 'saveLine::saveLine()'
编译我的应用程序时出现

错误。实际上从未调用过construcor。

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不再被认为是一个类,怎么会这样?

5 个答案:

答案 0 :(得分:5)

由于您为类saveLine提供了用户声明的构造函数,因此编译器不提供默认构造函数。您的构造函数不是默认构造函数(它有一个必需参数),因此您无法默认构造类型为saveLine的对象。

由于saveLine类中有MWindow个对象,因此需要使用构造函数在MWindow构造函数的初始化列表中初始化它:

MWindow::MWindow(QWidget *parent)
    : QWidget(parent), line1(parent)
{
    //...
}

(我假设父指针是你要传递的那个;如果你需要给它别的东西,那就给它需要的东西)

另一种选择是为saveLine的构造函数中的参数提供默认参数:

saveLine(QWidget *parent = 0);

这将允许在没有参数的情况下调用构造函数(并使其成为默认构造函数)。这是否有意义取决于父指针是否真的是可选的。显然,如果你这样做,你需要检查以确保在取消引用和使用之前指针不为空。

答案 1 :(得分:1)

你必须在MWindow的构造函数中调用saveLine的构造函数,为他提供所需的父级。

使用:

MWindow::MWindow(QWidget *parent) : QWidget(parent), line1(parent)
{
    this->setWindowTitle("Launcher");
    this->resize(600,600);
}

答案 2 :(得分:1)

  

但现在又出现了另一个错误

     

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;
};

答案 3 :(得分:0)

您在类声明中声明了saveLine的实例,而不是指向saveLine的指针。

您可以将MWindow中的引用更改为

saveLine* line1;

OR

你可以这样实现:

MWindow::MWindow(QWidget *parent):QWidget(parent), line1(parent)
{
    this->setWindowTitle("Launcher");
    this->resize(600,600);
}

答案 4 :(得分:0)

尝试在class saveLine;行的正上方添加class MWindow。当saveLine类和MWindow类的.h文件相互包含(直接或间接)时,通常会发生这种情况。例如,请参阅http://www.allegro.cc/forums/thread/594307

的前几篇文章