ожидаемое имя класса перед ‘{’

хорошо, я новичок в Qt, но не очень новичок в С++, ошибка возникает для рекурсивных включений, но посмотрите на мой код, я не вижу никаких рекурсивных включений.. я думаю, что это что-то еще, кто-нибудь поможет мне со следующей ошибкой:

ожидаемое имя класса перед токеном '{' {

Вот мой код:

#ifndef COLE_H
#define COLE_H

#include <QDialog>
#include "mainwindow.h"

namespace Ui {
class COLE;
}

class COLE : public QDialog , public Ui::MainWindow
{
    Q_OBJECT

public:
    explicit COLE(QWidget *parent = 0);
    ~COLE();

private slots:
    void on_pushButton_clicked();

public:
    double var1;

private:
    Ui::COLE *ui;

};


#endif // COLE_H

Я знаю, что проблема возникает из-за "public Ui::MainWindow", но я уверен, что так и должно быть. Я проверяю имя своего класса, и это MainWindow.

Пожалуйста, помогите.


person user2827482    schedule 26.12.2013    source источник
comment
У вас действительно есть какой-то другой COLE в пространстве имен Ui?   -  person drescherjm    schedule 26.12.2013
comment
Почему у вас два типа COLE? Покажите mainwindow.h, пожалуйста. Обычно это ui_mainwindow.h, так что вы сгенерировали его вручную, чтобы он отличался?   -  person lpapp    schedule 26.12.2013
comment
Вероятно, вам нужно #include ui_mainwindow.h   -  person drescherjm    schedule 26.12.2013
comment
В какой строке ошибка?   -  person Barmar    schedule 26.12.2013
comment
@drescherjm: нормально иметь одноименный класс внутри пространства имен Ui — он содержит код, сгенерированный uic.   -  person Matteo Italia    schedule 26.12.2013
comment
Я знаю это, но вместо этого OP использует Ui::MainWindow вместо Ui::COLE. И в этом случае предварительное объявление не сработает.   -  person drescherjm    schedule 26.12.2013
comment
@LaszloPapp: так обычно работает дизайнер Qt, я вовсе не нахожу это непрактичным, для этого и существуют пространства имен.   -  person Matteo Italia    schedule 26.12.2013
comment
Подождите минуту. Нужен ли общедоступный Ui::MainWindow?   -  person drescherjm    schedule 26.12.2013
comment
Здесь важен вопрос: чего вы пытаетесь достичь, наследуя от Ui::MainWindow?   -  person Matteo Italia    schedule 26.12.2013
comment
@drescherjm: для подхода одиночного наследования это не так. Для нескольких он есть, но он должен быть частным.   -  person lpapp    schedule 26.12.2013
comment
Я всегда использую подход множественного публичного наследования, поэтому я не заметил приватную часть Ui::COLE *ui.. OP не должен использовать оба метода одновременно.   -  person drescherjm    schedule 26.12.2013
comment
@drescherjm: это правильно.   -  person lpapp    schedule 26.12.2013


Ответы (1)


Кажется, у вас есть два текущих вопроса.

1) Вы должны включать ui_mainwindow.h, а не mainwindow.h, поскольку обычно это то, что по умолчанию генерируется компилятором пользовательского интерфейса (т.е. uic), если вы не измените его явно. Я предполагаю, что здесь это не так, поскольку обычно в этом нет необходимости.

Что касается второй проблемы, вы можете заставить ее работать двумя разными способами:

2a) Одиночный подход наследования: Короче говоря, таким образом вы используете композицию, а не наследование от класса пользовательского интерфейса. Итак, если вы решите сделать это таким образом, вам понадобится только член-указатель, а не наследование класса пользовательского интерфейса.

2b) Несколько подход наследования: Короче говоря, таким образом вы используете множественное наследование, как следует из его названия, а не композицию. Таким образом вы не используете элемент-указатель, а наследуете его от класса пользовательского интерфейса.

В настоящее время у вас, похоже, неправильный смешанный подход к двум вышеупомянутым случаям. Попробуйте придерживаться одного из них.

person lpapp    schedule 26.12.2013