val*_*ari 19 c++ visual-studio-2012
所以我最近在使用Visual C++ 2012时遇到了这个非常令人沮丧的问题.直到几个小时前,我编写的代码很好,一切都按预期工作,直到我决定优化一些东西并删除一些类.我修复了由此引发的所有错误,例如false包括等等.不幸的是,在此之后VS编译器发疯了.它开始给我错误,如:
Error 14 error C2653: 'Class' : is not a class or namespace name
Run Code Online (Sandbox Code Playgroud)
甚至
Error 5 error C2143: syntax error : missing ';' before '}'
Error 4 error C2059: syntax error : '>'
Run Code Online (Sandbox Code Playgroud)
我已经多次检查了,一切都在它的正确位置:包括所有标题,所有符号放在它们应该的位置.
据我所知,问题不在于我的代码,而在于编译器本身......我想,Visual Studio有时会非常烦人.无论如何,如果有人能帮我解决这个问题,我真的很感激.
(顺便说一句,禁用预编译头也没有工作)
代码的相关部分:
错误14:
#include "PlayerEntity.h"
PlayerEntity::PlayerEntity(void) {} // This line causes the error
Run Code Online (Sandbox Code Playgroud)
错误5:
class GameScreen : public BaseScreen
{
public:
...
private:
...
}; // This line causes the error
Run Code Online (Sandbox Code Playgroud)
错误4:
private:
std::vector<BaseEntity*> _EntityList; // This line causes the error
Run Code Online (Sandbox Code Playgroud)
整个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
Run Code Online (Sandbox Code Playgroud)
整个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
Run Code Online (Sandbox Code Playgroud)
整个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
Run Code Online (Sandbox Code Playgroud)
整个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
Run Code Online (Sandbox Code Playgroud)
整个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
Run Code Online (Sandbox Code Playgroud)
Mik*_*our 41
您的标头中有循环依赖关系.BaseEntity.h
包括Input.h
,包括,其中包括ScreenSystem.h
,其中包括GameScreen.h
,然后重新包括BaseEntity.h
.这导致类名在声明之前出现,导致编译失败.
为避免这种情况,请不要不必要地包含标头.例如,不包括Input.h
from BaseEntity.h
,因为根本不需要; 并且不包括BaseScreen.h
from ScreenSystem.h
因为只需要声明class BaseScreen;
,而不是完整的类定义.
另外,请检查您是否没有重复的标头保护.其中一些与标题名称不匹配(例如GHANDLER_H
for ScreenSystem.h
),这使我认为它们可能是从其他标题中意外复制的.最后,不要像_EntitySprite
你自己的符号那样使用保留名称; 为简单起见,避免引导或双下划线.
归档时间: |
|
查看次数: |
54274 次 |
最近记录: |