Помощь с ошибкой: ISO C ++ запрещает объявление «вектора» без типа - PullRequest
11 голосов
/ 12 октября 2009

Как следует из названия, я не уверен, почему я получаю эту ошибку. Я собрал 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

Ответы [ 2 ]

31 голосов
/ 12 октября 2009

Вектор находится в пространстве имен std. Вы должны сделать одно из следующего:

Добавить тип к пространству имен:

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

Сообщите компилятору, что вы используете vector из пространства имен std

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

Или скажите компилятору, что вы используете пространство имен std, которое будет содержать все (не рекомендуется, см. Комментарии)

using namespace std;
1 голос
/ 12 октября 2009

каждый символ, объявленный в стандартной библиотеке C ++, является частью пространства имен std. Чтобы использовать эти объявления, вы должны ссылаться на них по полному имени. а именно std ::.
Как ответил MichaelM, вы должны использовать std :: vector вместо 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

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

удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...