web-dev-qa-db-ja.com

コンパイラエラーC2653:クラス名または名前空間名ではありません

だから私は最近、Visual C++ 2012でこの非常にイライラする問題を抱えています。数時間前まで、私はコードをうまく書いていました。そのためにポップアップしていたすべてのエラーを修正しました。 false includeなど。残念なことに、この後、VSコンパイラは夢中になりました。次のようなエラーが表示され始めました。

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は時々本当に迷惑になることがあります。とにかく、誰かがこれについて私を助けてくれたら本当に感謝しています。

(ところで、プリコンパイル済みヘッダーを無効にするとnotが機能しました)

コードの関連部分:

エラー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
19
valtari

ヘッダーに循環依存関係があります。 BaseEntity.hにはInput.hが含まれ、ScreenSystem.hにはGameScreen.hが含まれ、これにはBaseEntity.hが含まれます。これにより、宣言される前にクラス名が表示され、コンパイルが失敗します。

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

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

41
Mike Seymour

エラーメッセージを質問にコピーしましたか、それとも再入力しましたか?エラー14には大文字のCを持つ「クラス」があり、これはほぼ間違いなく正しくありません。

また、ヘッダーファイルにはできるだけ少ないincludeディレクティブを使用する必要があります。たとえば、GameScreenはPlayerEntityを使用しないため、そのincludeを削除でき、BaseEntityはポインターを介してのみ使用されるため、置き換えることができます

#include "BaseEntity.h"

前方宣言付き

class BaseEntity;
3
IronMensan