2009-10-12 11 views
11

Jak wskazuje tytuł, nie jestem pewien, dlaczego otrzymuję ten błąd. Przygotowałem test.cpp, który jest podobny do tej struktury i działa dobrze. Poza problemem wektorowym istnieje inny problem dotyczący "chronionego", którego nawet nie ma w kodzie. Myślę, że "chroniony" to makro, więc nie wiadomo, co tam jest. Jestem nowy w QT, więc prawdopodobnie "robię to źle". Z pewnością to sugeruje kompilator.Pomoc z błędem: ISO C++ zabrania deklarowania "wektora" bez typu

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. 

Oto kod. Ponumerowałem linie zaznaczone w błędzie.

#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 

Odpowiedz

31

Wektor znajduje się w przestrzeni nazw standardowej. Trzeba wykonać jedną z następujących czynności:

Prepend typ z nazw:

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

poinformować kompilator używasz wektor z przestrzeni nazw std

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

Albo poinformować kompilator używasz nazw std, który przyniesie we wszystkim (nie zalecane, patrz komentarze)

using namespace std; 
+20

Proszę, dla miłości ludzkości, nie "używaj przestrzeni nazw XXX" w pliku nagłówkowym. Sprawisz, że każdy inny programista, który natknie się na to, płacze. –

+1

Zgoda, ale równie dobrze możesz powiedzieć ludziom opcje;) – MichaelM

+1

Cóż, włącz tę opcję: using std :: vector; Wolę go w .cpp zaraz po dołączeniu. Zapisuje wiązanie std :: wszędzie * i * dokumentuje, dlaczego nagłówek został dołączony (co nie zawsze jest tak oczywiste, jak w przypadku wektora). –

1

każdy symbol zadeklarowany w standardowej bibliotece C++ jest częścią standardowej przestrzeni nazw. Aby skorzystać z tych deklaracji, musisz podać je po imieniu. mianowicie std ::.
Jak MichaelM odpowiedział, powinieneś użyć std :: vector zamiast wektora. Można jednak użyć następujących „za pomocą deklaracji”:
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

W każdym razie większość czasu należy unikać deklaracji w plikach nagłówkowych, ponieważ zanieczyszcza globalnej przestrzeni nazw dla każdego użytkownika twojego nagłówka.

powodzenia

Powiązane problemy