Ошибка компилятора 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 14

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;