C++ 包含和声明正确的未声明标识符错误

C++ 包含和声明正确的未声明标识符错误,c++,compilation,include,declaration,C++,Compilation,Include,Declaration,我正在Qt中创建一个应用程序 我得到一个编译错误:错误C2065:“callDialog”:未声明的标识符 在我的分类对话课上 错误行: CallDialog* callDialog = ((CallDialog*)dialogStack->widget(1)); CategoryDialog类中的最后第五行: #include "ui_categorydialog_new.h" #include "calldialog.h" #include "question

我正在Qt中创建一个应用程序 我得到一个编译错误:错误C2065:“callDialog”:未声明的标识符 在我的分类对话课上 错误行:

CallDialog* callDialog = ((CallDialog*)dialogStack->widget(1));
CategoryDialog类中的最后第五行:

    #include "ui_categorydialog_new.h"
    #include "calldialog.h"
    #include "questionsdialog.h"
    #include "../objects/call.h"
    #include "../webservice/dataconnector.h"
    #include "../webservice/dataconngetter.h"

    namespace Ui {
        class CategoryDialog;
    }

    class CategoryDialog : public QDialog
    {
        Q_OBJECT

    public:
        explicit CategoryDialog(QWidget *parent = 0) : QDialog(parent), ui(new Ui::CategoryDialog){
            ui->setupUi(this);
        }

        ~CategoryDialog()
        {
            delete ui;
        }

    private slots:
        void on_btn_back_clicked()
        {
            ui->btn_back->setEnabled(false);
            DataConnGetter::getConnector()->setCallAbort(call->getId()); //get errormessage back and show errormessage when nessesary
            QStackedWidget* dialogStack = (QStackedWidget*)this->parentWidget();
            CallDialog* callDialog = ((CallDialog*)dialogStack->widget(1)); //TODO 005 replace indexes with enums > more clear
            callDialog->updateCalls(false);
            dialogStack->setCurrentIndex(1);
            ui->btn_back->setEnabled(true);
        }
CallDialog类如下所示

    #include <QDialog>
    #include <QString>
    #include <QList>
    #include <QSound>
    #include <QtDebug>
    #include <QStringList>
    #include <QPushButton>
    #include <QStackedWidget>
    #include <QtAlgorithms>
    #include <QLabel>
    #include <typeinfo>

    #include "ui_calldialog.h"
    #include "callbutton.h"
    #include "categorydialog_new.h"
    #include "../settings/consts.h"
    #include "../webservice/dataconnector.h"
    #include "../webservice/dataconngetter.h"
    #include "../settings/programsettings.h"
    #include "../webservice/pollingservice.h"

    class PollingService;

    namespace Ui {
        class CallDialog;
    }

    class CallDialog : public QDialog
    {
        Q_OBJECT

    public:
        //    explicit CallDialog(QWidget *parent = 0);
        //    ~CallDialog();
        //    void initCalls();
        //    void updateCalls(bool sound);
        //    void enablePoller();

        explicit CallDialog(QWidget *parent = 0) : QDialog(parent), ui(new Ui::CallDialog)
        {
            ui->setupUi(this);
            installEventFilter(this);
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“ui_calldialog.h”
#包括“callbutton.h”
#包括“categorydialog_new.h”
#包括“./设置/常数h”
#包括“./webservice/dataconnector.h”
#包括“./webservice/datacongetter.h”
#包括“./settings/programsettings.h”
#包括“./webservice/pollingservice.h”
类轮询服务;
名称空间用户界面{
类调用对话框;
}
类调用对话框:公共QDialog
{
Q_对象
公众:
//显式调用对话框(QWidget*parent=0);
//~CallDialog();
//void initCalls();
//无效更新呼叫(布尔声音);
//void enablePoller();
显式CallDialog(QWidget*parent=0):QDialog(parent),ui(新ui::CallDialog)
{
用户界面->设置用户界面(此);
installEventFilter(此);
请注意CategoryDialog中包含的正确选项

它们确实相互包含(可能是循环依赖问题?) 我试过使用前向声明CallDialog。没有帮助

这些文件只是直接包含实现的.h文件

编辑

我绕过了这个问题,如下所示: 我添加了一个抽象类,其中包含CallDialog从CategoryDialog中使用的函数

像这样:

#ifndef ABSTRACTDIALOG_H
#define ABSTRACTDIALOG_H

#include <QDialog>

#include "../objects/call.h"

class AbstractDialog : public QDialog
{
    Q_OBJECT

public:
    explicit AbstractDialog(QWidget *parent = 0) : QDialog(parent){}
    void setCall(Call* call){
        _call = call;
    }
private:
    Call* _call;

};

#endif // ABSTRACTDIALOG_H
\ifndef ABSTRACTDIALOG\u H
#定义抽象对话框
#包括
#包括“./objects/call.h”
类抽象对话框:公共QDialog
{
Q_对象
公众:
显式抽象对话框(QWidget*parent=0):QDialog(parent){}
void setCall(Call*Call){
_呼叫=呼叫;
}
私人:
呼叫*\u呼叫;
};
#endif//ABSTRACTDIALOG\u H

CategoryDialog
之前向前声明CallDialog将不起作用,因为使用了
CallDialog
成员函数,编译器需要了解它们


您是否尝试在调用对话框之前声明
CategoryDialog
,并删除,我猜,
#包括“CategoryDialog_new.h”
?由于没有显示所有的
调用对话框.h
,我不确定您是如何在该文件中使用
类别对话框的。

您能指出导致编译器错误的行号和文件吗?是的,我添加了错误行(第一个代码块的最后第五行)您能将失败行更改为
((调用对话框*)dialogStack->widget(1))->updateCalls(false)
变量
callDialog
只在下一行使用一次,编译器错误抱怨
callDialog
,而不是
callDialog
。我想知道更改后产生了什么错误,因为我没有看到代码有任何明显的错误。声明的右括号后面有分号吗CallDialog类的名称(应该有一个)?@Berty你能上传编译器产生的所有错误并尽可能完成源代码吗?我试过了,但后来它说它不知道CategoryDialog。我正在尝试解决循环包含问题。@Berty因为两个头都需要使用另一个头,要解决这个问题,我相信你必须将实现放在一个cpp文件中s、 哈哈,我正试图摆脱cpp文件。这会大大降低开发速度。不幸的是,这会造成一些错误。