タイトルにあるように、なぜこのエラーが発生するのかわかりません。この構造に似た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
ベクターはstd名前空間にあります。次のいずれかを実行する必要があります。
タイプの前に名前空間を付けます。
std::vector<std::vector<char *> > chars;
Std名前空間からのベクターを使用していることをコンパイラーに伝えます
using std::vector;
vector<vector<char *> > chars;
または、std名前空間を使用していることをコンパイラーに伝えます。これにより、すべてが取り込まれます(推奨されません。コメントを参照してください)。
using namespace std;
c ++標準ライブラリで宣言されているすべてのシンボルは、std名前空間の一部です。これらの宣言を使用するには、フルネームで参照する必要があります。つまり、std ::。
MichaelMが答えたように、vectorの代わりにstd :: vectorを使用する必要があります。ただし、次の「using宣言」を使用できます。
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
いずれの場合も、ヘッダーのすべてのユーザーのグローバル名前空間を汚染するため、ほとんどの場合、ヘッダーファイルでの宣言の使用は避けてください。
幸運を