Qt "нет подходящей функции для вызова" - PullRequest
0 голосов
/ 20 апреля 2010

у меня

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 в векторе для создания линий во время выполнения.

РЕДАКТИРОВАТЬ: я неправильно объявил строку 1, она должна читать

saveLine *line1;

но теперь выдает еще одну ошибку

ISO C++ forbids declaration of 'saveLine' with no type

и

expected ';' before '*' token

в этой строке. Похоже, что saveLine больше не считается классом, как же так?

Ответы [ 5 ]

5 голосов
/ 20 апреля 2010

Поскольку вы предоставляете объявленный пользователем конструктор для класса saveLine, конструктор по умолчанию не предоставляется компилятором. Ваш конструктор не является конструктором по умолчанию (у него есть один обязательный параметр), поэтому вы не можете по умолчанию создать объект типа saveLine.

Поскольку у вас есть saveLine объект в вашем классе MWindow, вам нужно инициализировать его с помощью вашего конструктора, в списке инициализатора конструктора MWindow:

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

(я предполагаю, что родительский указатель - это тот, который вы хотите передать; если вам нужно дать ему что-то еще, тогда дайте ему то, что ему нужно)

Другой вариант - указать аргумент по умолчанию для параметра в конструкторе saveLine:

saveLine(QWidget *parent = 0);

Это позволило бы вызывать этот конструктор без аргументов (и сделать его конструктором по умолчанию). То, имеет ли это смысл, зависит от того, является ли родительский указатель действительно необязательным. Очевидно, что если вы сделаете это, вам нужно проверить, чтобы убедиться, что указатель не является нулевым, прежде чем разыменовывать и использовать его.

1 голос
/ 21 апреля 2010

но теперь выдает еще одну ошибку

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;
};
1 голос
/ 20 апреля 2010

Вы должны вызвать конструктор saveLine в конструкторе MWindow, чтобы предоставить ему нужного родителя.

Использование:

MWindow::MWindow(QWidget *parent) : QWidget(parent), line1(parent)
{
    this->setWindowTitle("Launcher");
    this->resize(600,600);
}
0 голосов
/ 21 апреля 2010

Попробуйте добавить class saveLine; чуть выше строки class MWindow. Это часто происходит, когда файлы .h для класса saveLine и класса MWindow включают друг друга (прямо или косвенно). Например, посмотрите первые несколько постов http://www.allegro.cc/forums/thread/594307

0 голосов
/ 20 апреля 2010

Вы объявляете экземпляр saveLine в объявлении класса вместо указателя на saveLine.

Вы можете изменить ссылку в MWindow на

saveLine* line1;

ИЛИ

вы можете реализовать так:

MWindow::MWindow(QWidget *parent):QWidget(parent), line1(parent)
{
    this->setWindowTitle("Launcher");
    this->resize(600,600);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...