错误帮助:ISO C++ 禁止声明没有类型的“向量”

Posted

技术标签:

【中文标题】错误帮助:ISO C++ 禁止声明没有类型的“向量”【英文标题】:Help with error: ISO C++ forbids declaration of 'vector' with no type 【发布时间】:2009-10-12 00:11:29 【问题描述】:

正如标题所述,我不确定为什么会收到此错误。我已经整理了一个类似于这个结构的 test.cpp,它工作正常。此外,除了向量问题之外,还有另一个关于“受保护”的问题,甚至不在代码中。我认为“受保护”是一个宏,所以不知道那里有什么。我是 QT 的新手,所以我很可能“做错了”。这当然是编译器的建议。

In file included from DrvCrystalfontz.cpp:8:
LCDText.h:28: error: ISO C++ forbids declaration of 'vector' with no type
LCDText.h:28: error: expected ';' before '<' token
LCDText.h:30: error: ISO C++ forbids declaration of 'vector' with no type
LCDText.h:30: error: expected ',' or '...' before '<' token
LCDText.h:46: error: expected ':' before 'protected'
LCDText.h: In constructor 'LCDText::LCDText(int, int, int, int, int, int, int, QObject*)':
LCDText.h:33: error: expected '' at end of input
scons: *** [DrvCrystalfontz.o] Error 1
scons: building terminated because of errors.

这是代码。我已经对错误中指出的行进行了编号。

#ifndef __LCD_TEXT__
#define __LCD_TEXT__

#include <vector>
#include <QObject>

#include "LCDBase.h"
#include "WidgetText.h"
#include "WidgetBar.h"
#include "WidgetHistogram.h"
#include "WidgetIcon.h"
#include "WidgetBignums.h"
#include "WidgetGif.h"

class LCDText: public LCDBase, public virtual QObject 
    Q_OBJECT
    protected:
        char *LayoutFB;
        char *DisplayFB;
        int GOTO_COST;
        int CHARS;
        int CHAR0;
        int LROWS;
        int LCOLS;
        int DROWS;
        int DCOLS;
        vector<vector<char *> > chars; // Line 28
        void (*TextRealWrite) (const int row, const int col, const char *data, const int len);
        void (*TextRealDefchar) (const int ascii, const vector<char *> matrix); // Line 30
    public:
        LCDText(int rows, int cols, int xres, int yres, int _goto, int chars,
            int char0, QObject *parent) : LCDBase(xres, yres), QObject(parent); // Line 33
        ~LCDText();
        void TextInit(int rows, int cols);
        void TextBlit(int row, int col, int  height, int width);
        void TextClear();
        void TextClearChars();
        void TextGreet();
        void TextDraw(WidgetText widget);
        void TextBarDraw(WidgetBar widget);
        void TextHistogramDraw(WidgetHistogram widget);
        void TextIconDraw(WidgetIcon widget);
        void TextBignumsDraw(WidgetBignums widget);
        void TextGifDraw(WidgetGif widget);
     public signals: // Line 46
         void SpecialCharChanged(int ch);
     public slots:
         void TextSpecialCharChanged(int ch);
;

#endif

【问题讨论】:

【参考方案1】:

Vector 位于 std 命名空间中。您必须执行以下操作之一:

在类型前加上命名空间:

std::vector<std::vector<char *> > chars;

告诉编译器你正在使用 std 命名空间中的向量

using std::vector;
vector<vector<char *> > chars;

或者,告诉编译器你正在使用 std 命名空间,它将带入所有内容(不推荐,参见 cmets)

using namespace std;

【讨论】:

为了人类的爱,请不要在头文件中“使用命名空间 XXX”。你会让所有遇到它的程序员哭泣。 同意,但你也可以告诉别人选项;) 那么包括这个选项: using std::vector;我更喜欢在包含之后立即在 .cpp 中使用它。将 std:: 全部保存在 记录包含标头的原因(这并不总是像在矢量的情况下那样明显)。 来吧 - 这还不错。 IF 你把它放在你的类定义中。像任何声明一样,它是有范围的。【参考方案2】:

在 C++ 标准库中声明的每个符号都是 std 命名空间的一部分。为了使用这些声明,您必须通过它的全名来引用它。即 std::. 正如 MichaelM 回答的那样,您应该使用 std::vector 而不是向量。 但是,您可以使用以下“使用声明”: 1.using std::vector; 2.using namespace std; // using namespace ...; is mostly discouraged as it causes a mass-import of symbols into the global namespace

在任何情况下,大多数时候您都应该避免在头文件中使用声明,因为它会污染您头文件的每个用户的全局命名空间。

祝你好运

【讨论】:

以上是关于错误帮助:ISO C++ 禁止声明没有类型的“向量”的主要内容,如果未能解决你的问题,请参考以下文章

如何调试“ISO C++ 禁止声明没有类型的‘汽车’”?

ISO C++ 禁止声明没有类型的“堆栈”

ISO C++ 禁止声明没有类型的“myStruct”

ISO C++ 禁止可变大小数组(编译错误)

需要帮助使用 boost 在类定义中为向量分配空间

出现错误:“ISO C++ 禁止指针和整数 [-fpermissive] 之间的比较”如何解决?