我正在使用的Qt应用程序中收到没有类型错误的禁止声明。问题是我包含了声明该类的头文件。据我所知,应该将其定义为类型。我也尝试了前向声明,但是我想在此文件中使用类的方法,因此我需要整个头文件。
码:

Shapes.h

#ifndef SHAPES_H
#define SHAPES_H

#include "Colors.h"
#include <QPoint>
#include "glwidget.h"

//class GLWidget;

class Shape
{
    public:

        virtual void draw();
};

class Rectangle : public Shape
{
    public:
        Rectangle(GLWidget *w, QPoint tl, QPoint br);

        virtual void draw(){
              // top horizontal
            for(int i = topLeft.x(); i < btmRight.x(); i++){
                 glWidget->setPixel(i,topLeft.y(), color);
             }
        }

    private:
        QPoint topLeft,btmRight;
        GLWidget *glWidget;        /****  This is the Error line  ****/
        RGBColor color;
};

#endif // SHAPES_H

glwidget.h:
#ifndef AGLWIDGET_H
#define AGLWIDGET_H

#include <QGLWidget>

#include "Colors.h"
#include "Shapes.h"

class GLWidget : public QGLWidget
{
    Q_OBJECT

public:
    GLWidget(QWidget *parent = 0);
    ~GLWidget();

    QSize minimumSizeHint() const;
    QSize sizeHint() const;

    void setPixel(int x, int y, RGBColor c);

public slots:
    void setColor(RGBColor c);
    void setDrawRectangle();



protected:
    void initializeGL();
    void paintGL();
    void resizeGL(int width, int height);
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);

private:

    QPoint lastPos;
    QVector<QPoint> drawPoints;
    RGBColor paintColor;
    int drawmode;
    Shape *currentShape;

};


#endif

我不明白为什么我不能在Shapes.h中使用GLWidget。错误是在我声明GLWidget * glWidget;的行上的Shapes.h中;
如果我使用前向声明即。 GLWidget类;这个错误消失了,但是我实际上不能像Rectangle.draw()那样使用GLWidget方法

有人知道为什么编译器不会在Shapes.h中将GLWidget视为类型吗?

确切的错误:

Shapes.h:20:错误:“*”标记之前应有预期的“)”
Shapes.h:31:错误:ISO C++禁止无类型的'GLWidget'声明
Shapes.h:31:错误:预期为';'在“*” token 之前
Shapes.h:在成员函数'virtual void Rectangle::draw()'中:
Shapes.h:25:错误:未声明“glWidget”(首先使用此功能)
Shapes.h:25:错误:(每个未声明的标识符对于出现在其中的每个功能仅报告一次。)

最佳答案

您的头文件之间具有循环依赖关系-Shapes.h包含glwidget.h,而后者又包含Shapes.h。因此,编译器第二次尝试包含glwidget.h时,已经定义了include保护AGLWIDGET_H,因此不再包含它,然后Shapes.h中的代码尝试使用应该已经声明的类型,但是不是。

要解决此问题,您需要删除其中一个依赖项,而改用正向声明。由于glwidget.h除了声明指针成员变量外,实际上并未使用Shape类,因此应删除其中包含Shapes.h的内容:

glwidget.h:

#ifndef AGLWIDGET_H
#define AGLWIDGET_H

// do NOT include Shapes.h

class Shape;  // forward declaration

class GLWidget : public QGLWidget
{
    ...
    Shape *currentShape;
};

#endif

Shapes.h与以前相同:
#ifndef SHAPES_H
#define SHAPES_H

#include "glwidget.h"
...
#endif

关于c++ - Qt ISO C++禁止无类型声明-是否包含头文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3817208/

10-13 08:31