2009-10-12 31 views
11

Khi trạng thái tiêu đề, tôi không chắc chắn lý do tại sao tôi nhận được lỗi này. Tôi đã đặt cùng một test.cpp tương tự như cấu trúc này, và nó hoạt động tốt. Ngoài ra, ngoài vấn đề vectơ, còn có vấn đề khác về 'được bảo vệ', mà thậm chí không có trong mã. Tôi nghĩ rằng 'bảo vệ' là một vĩ mô, vì vậy không nói gì ở đó. Tôi mới sử dụng QT, vì vậy tôi có thể "làm sai". Đó chắc chắn là những gì trình biên dịch đề xuất.Trợ giúp với lỗi: ISO C++ cấm tuyên bố 'vector' không có loại

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. 

Đây là mã. Tôi đã đánh số các dòng được ghi trong lỗi.

#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 

Trả lời

31

Vector nằm trong không gian tên std. Bạn phải làm một trong những điều sau đây:

Thêm vào trước các loại với không gian tên:

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

Nói với trình biên dịch bạn đang sử dụng vector từ namespace std

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

Hoặc, nói với trình biên dịch bạn đang sử dụng không gian tên std, sẽ mang lại mọi thứ (không được khuyến nghị, xem nhận xét)

using namespace std; 
+20

Xin vui lòng, vì tình yêu nhân loại, đừng "sử dụng không gian tên XXX" trong tệp tiêu đề. Bạn sẽ làm cho mọi lập trình viên khác bắt gặp nó khóc. –

+1

Đồng ý, nhưng bạn cũng có thể nói cho mọi người biết các tùy chọn;) – MichaelM

+1

Sau đó, bao gồm tùy chọn này: using std :: vector; Tôi thích nó trong .cpp ngay lập tức sau khi bao gồm. Tiết kiệm ràng buộc std :: trên tất cả các vị trí * và * tài liệu tại sao tiêu đề được bao gồm (không phải lúc nào cũng rõ ràng như trong trường hợp của vectơ). –

1

mọi biểu tượng được khai báo trong thư viện chuẩn C++ là một phần của không gian tên std. Để sử dụng các khai báo này, bạn phải tham khảo nó bằng tên đầy đủ của nó. cụ thể là std ::.
Như MichaelM trả lời bạn nên sử dụng std :: vector thay vì vector. Bạn có thể, tuy nhiên, sử dụng sau đây "sử dụng tờ khai":
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

On mọi trường hợp, hầu hết thời gian bạn nên tránh sử dụng tuyên bố trong các tập tin tiêu đề vì nó gây ô nhiễm không gian tên toàn cầu cho mọi người dùng tiêu đề của bạn.

chúc may mắn

Các vấn đề liên quan