Ошибка компилятора C2653: нет имени класса или пространства имен
Так что в последнее время у меня возникла эта крайне неприятная проблема с Visual C++ 2012. Еще несколько часов назад я писал код просто отлично, и все работало так, как задумывалось, пока я не решил оптимизировать некоторые вещи и удалил несколько классов. Я исправил все ошибки, которые возникали из-за этого, например, ложные включения и т. д. К сожалению, после этого компилятор 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
Вся Личность Игрока.файл 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
Весь Игровой Экран.файл 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
Вся База.файл 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
Весь Вход.файл 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
Вся Система Экранов.файл 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
2 ответа:
У вас есть циклическая зависимость в заголовках.
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
для ваших собственных символов; для простоты избегайте ведущих или двойных подчеркиваний.
Вы скопировали сообщения об ошибках в свой вопрос или перепечатали их? Потому что ошибка 14 имеет "класс" с большой буквы С, что почти наверняка неверно.
Кроме того, вы должны использовать как можно меньше директив include в заголовочных файлах. Например, GameScreen не использует PlayerEntity, поэтому вы можете удалить это включение, а BaseEntity используется только с помощью указателя, поэтому вы можете заменить
#include "BaseEntity.h"
С прямым объявлением
class BaseEntity;