2013-04-01 59 views
12

最近、このVisual C++ 2012には非常にイライラした問題がありました。数時間前まで、コードをうまく書いていました。いくつかのものを最適化することを決め、いくつかのクラスを削除しました。私はそれのためにポップアップしていたすべてのエラーを修正しました。 falseが含まれています。残念なことに、この後、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.hInput.hを含み、ScreenSystem.hを含み、これにはGameScreen.hが含まれ、BaseEntity.hが含まれます。これにより、クラス名が宣言される前に表示され、コンパイルに失敗します。

これを避けるには、不必要にヘッダーを含めないでください。たとえば、BaseEntity.hInput.hは含まれていないので、必要ありません。 class BaseScreen;という宣言だけが必要であり、完全なクラス定義ではないため、ScreenSystem.hBaseScreen.hは含まれません。

また、ヘッダーガードが重複していないことを確認してください。一部のヘッダー名が一致しない(例:ScreenSystem.hGHANDLER_H)、他のヘッダーから誤ってコピーされた可能性があります。最後に、自分のシンボルに_EntitySpriteのような予約名を使用しないでください。簡単にするために、先頭または二重のアンダースコアを避けてください。

+0

@Jakobson:問題が解決した場合は、チェックマークをクリックして回答を受け入れてください(できるだけ男性にupvoteを渡してください)。私の+1。 –

+0

+1も同様です。良い言葉。 – WhozCraig

+0

"重複するヘッダーガード" - d oh!この答えを見つけるために年を取った。 – cloudfeet

3

は、あなたの質問にエラーメッセージをコピーしたのか、あなたがそれらを再入力したのですか?エラー14は、ほとんど確実に正しい資本Cを持つ「クラス」を持っているからです。

また、できるだけヘッダーファイルにincludeディレクティブを使用する必要があります。例えば、GameScreenはPlayerEntityを使用していないので、あなたには、その削除することができますし、前方宣言と

#include "BaseEntity.h" 

を交換できるようにBaseEntityはポインタのみを経由して使用されている

class BaseEntity; 
関連する問題