2012-02-07 45 views
0

我正在使用Code :: Blocks和Mingw32與SDL庫。該錯誤出現在我的代碼的第13行(下面評論)。錯誤:多個類型在一個聲明中

經過一番搜索,我相信它是一個缺少分號(;),但這似乎並不是這種情況。額外的研究發現它可能是一個包含文件中的錯誤。

不幸的是,include中沒有錯誤,甚至當include被註釋掉時,這個錯誤依然存在。當enum塊被註釋掉時,錯誤會跳轉到類聲明的末尾。

#ifndef _TILE_H_ 
#define _TILE_H_ 

#include "Define.h" 

enum 
{ 
    TILE_TYPE_NONE = 0, 
    TILE_TYPE_GROUND, 
    TILE_TYPE_RAMPUP, 
    TILE_TYPE_RAISED, 
    TILE_TYPE_RAMPDOWN 
}; //error occurs here (line 13) 

class Tile 
{ 
public: 
    int TileID; 
    int TypeID; 

public: 
    Tile(); 
}; 

#endif 

這實際上開始添加一個新的類之後發生的事情,但是新類是完全不相關的,並且不使用,包括或從一個貼在所有的繼承。

任何意見或信息將非常感激。

編輯(添加Define.h):

#ifndef _DEFINE_H_ 
#define _DEFINE_H_ 

#define MAP_WIDTH 40 
#define MAP_HEIGHT 40 

#define TILE_SIZE 16 

#define WINDOW_WIDTH 640 
#define WINDOW_HEIGHT 480 

#endif 
+2

你是不是想給你的'enum'一個名字? (例如'enum e_tile_type {/*...*/};') – Johnsyweb 2012-02-07 00:55:34

+1

尋找包含文件的問題 – Anycorn 2012-02-07 00:57:16

+0

編譯器給你的錯誤信息是什麼? – Pochi 2012-02-07 00:58:34

回答

8

你有這樣的文件:

#include "Something.h" 
#include "Tile.h" 

Something.h,你有這樣的:

class Something { 
    // ... 
} 

你缺少一個分號,所以編譯器看到:

class Something { 
    // ... 
} 
enum { 
}; 

這是一個包含兩種類型的聲明(一個class和一個enum),這是不允許的。分號class後需要structenum因爲你可以在相同的聲明作爲類型聲明一個新類型的實例:

struct Point { int x; int y; } my_point; 

(另外,從_名和一個大寫字母被保留使用TILE_H而不是_TILE_H_。)

+0

就是這樣,很多英里以外的地方都有一個缺失的分號,它把所有的東西都扔掉了。謝謝你的解釋。 – TechRomancer 2012-02-08 15:42:52

+0

@TechRomancer:我的榮幸。我在書中犯了每一個C++錯誤。 :P – 2012-02-08 15:48:46

1

當我註釋掉包括用於Define.h,這個代碼編譯細我使用克++對。這表明,如您所建議的那樣,包含文件中可能確實存在問題。也許你在Define.h末尾的某處丟失了一個分號,或者在那裏有一些其他的語法問題。

+0

我編輯的帖子也包含了Define.h。對於我來說,當include在Tile.h中被註釋掉時,編譯器仍會拋出相同的錯誤。 – TechRomancer 2012-02-07 01:07:06

+0

是的,它在Define.h中看起來沒有問題。但是,它只包含宏,沒有代碼,所以也許問題實際上出現在Tile.h之前的代碼中。您可以嘗試編譯Tile.h包含在「gcc -E」或等效文件中的文件,以查看預處理器輸出。 – 2012-02-07 14:50:46

0

我叫你的第一個文件Tile.h創造Tile.cpp如下:

#include "Tile.h" 

Tile::Tile() 
{ 
} 

int main() 
{ 
    return 0; 
} 

然後我編譯Ubuntu Linux上使用g ++:

$ g++ Tile.cpp -o Tile

我收到既不是編譯也不是運行時錯誤(同樣爲gcc)。您的問題在其他地方 - 無論是在#include d文件中,您沒有向我們展示,或者某種平臺特定的命名衝突。我會嘗試逐步重命名,直到問題消失。

編輯:您的原始代碼在這種情況下保持不變。