だから私は最近、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
ヘッダーに循環依存関係があります。 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
などの予約名を独自のシンボルに使用しないでください。簡単にするために、先頭または二重のアンダースコアは避けてください。
エラーメッセージを質問にコピーしましたか、それとも再入力しましたか?エラー14には大文字のCを持つ「クラス」があり、これはほぼ間違いなく正しくありません。
また、ヘッダーファイルにはできるだけ少ないincludeディレクティブを使用する必要があります。たとえば、GameScreenはPlayerEntityを使用しないため、そのincludeを削除でき、BaseEntityはポインターを介してのみ使用されるため、置き換えることができます
#include "BaseEntity.h"
前方宣言付き
class BaseEntity;