[解決済み] コンパイラーエラー 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は時々、本当にイライラさせられますね。とにかく、この件に関して誰かが私を助けてくれるなら、本当にありがたいことです。
(ちなみに、プリコンパイルヘッダを無効化すると ではなく が働く)
コードの関連部分。
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
に対して
ScreenSystem.h
)であることから、誤って他のヘッダーからコピーされた可能性があると思われます。最後に、以下のような予約名は使わないでください。
_EntitySprite
また、簡単のために、先頭のアンダースコアやダブルアンダースコアは使わないでください。
関連
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み】静的定数文字列(クラスメンバ)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】C++の余分な資格エラー
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] C++の識別子でアンダースコアを使用する場合のルールについて教えてください。