2010-04-20 3 views
0

У меня естьQt «нет функции согласования для вызова»

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

EDIT: Я misdeclared line1, он должен читать

saveLine *line1; 

, но теперь она дает другую ошибку

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

и

expected ';' before '*' token 

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

ответ

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

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

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

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

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

Другим вариантом было бы предоставить аргументы по умолчанию для параметра в конструкторе saveLine «s:

saveLine(QWidget *parent = 0); 

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

+0

Незначительный нит: вы должны передать 'this' вместо' parent' 'в' line1() '. – Bill

+0

Я сделал, это не помогло. – Blin

+0

Хорошая точка - всегда добавляет свой собственный конструктор по умолчанию в дополнение к перегруженным конструкторам. – RooiWillie

1

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

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

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

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

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

saveLine* line1; 

ИЛИ

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

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

Для чего это модно? – CDSO1

+0

Интересно, я действительно забыл использовать указатель. У компилятора Althoug теперь есть другая ошибка «ISO C++ запрещает объявление« saveLine »без типа» и «expected»; перед '*' token " – Blin

+0

Возможно, вам не хватает директивы #include? – CDSO1

0

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

Смежные вопросы