2013-04-01 152 views
12

因此,我最近在使用Visual C++ 2012時遇到了這個極其令人沮喪的問題。直到幾個小時前,我一直在編寫代碼,並且所有內容都按預期工作,直到我決定優化一些東西並刪除幾個類。我修復了因此而出現的所有錯誤,例如假包括等等。不幸的是,在這之後VS編譯器瘋了。它開始給我的錯誤,如:編譯器錯誤C2653:不是類或名稱空間名稱

Error 14 error C2653: 'Class' : is not a class or namespace name 

甚至

Error 5 error C2143: syntax error : missing ';' before '}' 
Error 4 error C2059: syntax error : '>' 

我檢查了多次,並且一切都在它的正確的地方:所有標頭在內,放在哪裏他們應該是所有符號。

據我所知,問題不在於我的代碼,而在於編譯器本身......我想,Visual Studio可能真的很煩人。無論如何,如果有人能幫我解決這個問題,我會非常感激。

(順便說一句,禁用預編譯頭沒工作)

相關的代碼部分:

錯誤14:

#include "PlayerEntity.h" 
PlayerEntity::PlayerEntity(void) {} // This line causes the error 

錯誤5:

class GameScreen : public BaseScreen 
{ 
public: 
    ... 
private: 
    ... 
}; // This line causes the error 

錯誤4:

private: 
    std::vector<BaseEntity*> _EntityList; // This line causes the error 

全PlayerEntity.h文件:

#ifndef PENTITY_H 
#define PENTITY_H 

#include "BaseEntity.h" 

class PlayerEntity : public BaseEntity 
{ 
public: 
    PlayerEntity(void); 
    PlayerEntity(float, float); 
    virtual ~PlayerEntity(void); 

    void render(sf::RenderWindow&); 
    void update(); 
private: 
    void init(); 
}; 

#endif 

全GameScreen.h文件:

#ifndef GSCREEN_H 
#define GSCREEN_H 

#include "BaseScreen.h" 
#include "BaseEntity.h" 
#include "PlayerEntity.h" 

class GameScreen : public BaseScreen 
{ 
public: 
    GameScreen(sf::Vector2u&); 
    virtual ~GameScreen(void); 

    void start(); 
    void stop(); 

    void render(sf::RenderWindow&); 
    void update(void); 

    void addEntity(BaseEntity*); 
    void destoryEntity(int id); 
private: 
    std::vector<BaseEntity*> _EntityList; 
    sf::Vector2u _ScreenDimensions; 
}; 

#endif 

全BaseEntity.h文件:

#ifndef BSENTITY_H 
#define BSENTITY_H 

#include "Input.h" 
#include <SFML/Graphics.hpp> 

class BaseEntity 
{ 
public: 
    BaseEntity(void); 
    virtual ~BaseEntity(void); 

    sf::Vector2f position; 

    virtual void update(void); 
    virtual void render(sf::RenderWindow&); 
    void compare(BaseEntity*); 
protected: 
    sf::Texture *_EntityTexture; 
    sf::Sprite _EntitySprite; 

    bool _isAlive; 
    int _id; 

    virtual void init(); 
}; 

#endif 

全Input.h文件:

#ifndef INPUT_H 
#define INPUT_H 

#include "ScreenSystem.h" 
#include <SFML/Window.hpp> 

class Input 
{ 
public: 
    Input(void); 
    Input(sf::RenderWindow*); 
    virtual ~Input(void); 

    static bool keyPressed(int); 
    static bool keyReleased(int); 

    static bool mouseHeld(int); 
    static bool mouseReleased(int); 
private: 
    static sf::RenderWindow *_Window; 
}; 

#endif 

全ScreenSystem.h文件:

#ifndef GHANDLER_H 
#define GHANDLER_H 

#include "BaseScreen.h" 
#include "MenuScreen.h" 
#include "GameScreen.h" 
#include <SFML/Window.hpp> 

class ScreenSystem 
{ 
public: 
    ScreenSystem(void); 
    ScreenSystem(sf::RenderWindow*); 
    virtual ~ScreenSystem(void); 

    BaseScreen *getCurrentScreen(void); 
    void setScreen(int); 
private: 
    int _currentScreenID; 

    std::vector<BaseScreen*> _Screens; 
    sf::RenderWindow *_Window; 
}; 

#endif 
+4

我懷疑這是編譯器本身的問題。 –

+0

檢查你的類聲明的關閉,以確保它們以'};'結束,而不僅僅是'}; **他們全部**。同時檢查每對'{','}對的平衡。由於您提供的PlayerEntity構造函數的內容顯然應該是有效的C++,並且因爲它上面唯一的東西是頭包含,所以可能會讓您認爲包含文件是**不相關,因此不應包含在內這裏進行檢查? – WhozCraig

+2

請提供一個[簡短,自包含,正確的示例](http://sscce.org/) – Oswald

回答

31

你有一個循環依賴在你的頭文件中。BaseEntity.h包括Input.h,其包括ScreenSystem.h,其包括GameScreen.h,其又包括BaseEntity.h。這導致類名在聲明之前出現,導致編譯失敗。

爲了避免這種情況,請不要不必要地包含標頭。例如,不包括BaseEntity.h中的Input.h,因爲根本不需要;並且不包括ScreenSystem.h中的BaseScreen.h,因爲只需要聲明class BaseScreen;,而不是完整的類定義。

此外,請檢查您是否沒有重複的標頭警衛。其中一些與標題名稱不匹配(例如GHANDLER_HScreenSystem.h),這讓我認爲它們可能是從其他標題意外複製的。最後,不要使用像_EntitySprite這樣的保留名稱作爲自己的符號;爲簡單起見,避免前導或雙下劃線。

+0

@Jakobson:如果它解決了你的問題,請點擊對號接受答案(如果可以的話,給男士一個upvote)。從我+1。 –

+0

+1。良言。 – WhozCraig

+0

「重複標題守衛」 - 德哦!花了我很多時間找到這個答案。 – cloudfeet

3

你複製錯誤信息到你的問題還是你重新輸入?因爲錯誤14具有大寫字母C的'類',這幾乎肯定是不正確的。

此外,你應該儘可能少的包含在你的頭文件中的指令。例如,GameScreen不使用PlayerEntity,這樣你就可以刪除包含和BaseEntity只能通過指針使用,所以你可以用預先聲明取代

#include "BaseEntity.h" 

class BaseEntity; 
相關問題