未知原因的编译器错误 (C++)
Posted
技术标签:
【中文标题】未知原因的编译器错误 (C++)【英文标题】:Compiler Error for unknown reasons (C++) 【发布时间】:2011-05-07 10:56:45 【问题描述】:当我尝试编译时,我在 MSVS C++ 2010 IDE 中遇到编译器错误 (C2061)。我根本不知道它为什么会发生,因为我看不到明显的错误。
#pragma once
#ifndef _CCOMPONENT_H
#define _CCOMPONENT_H
#include "CGame.h"
class CComponent
public:
CComponent(CGame &game);
~CComponent();
protected:
virtual void Draw();
virtual void Update();
virtual void Init();
void Dispose();
;
#endif // _CCOMPONENT_H
编译器错误:
ccomponent.h(10): error C2061: syntax error : identifier 'CGame'
CGame.h 的内容
/**************************************************
*
*
****************************************************/
#pragma once
#ifndef _CGAME_H
#define _CGAME_H
#include <cstdio>
#include <list>
//#include <Box2D/Box2D.h>
#include <allegro5\allegro5.h>
#include "SharedDef.h"
#include "CComponent.h"
#include "CTestPlayer.h"
using namespace std;
class CComponent;
class CTestPlayer;
const int MAX_COMPONENTS = 255;
class CGame
public:
// CONSTRUCTORS
CGame();
~CGame();
// ACCESSORS
ALLEGRO_DISPLAY *GetGameDisplay();
ALLEGRO_EVENT_QUEUE *GetGameEventQueue();
list<CComponent> GetComponents() return *m_Components;
void AddComponent(CComponent component);
bool IsRun();
void StartTimer();
void StopTimer();
virtual bool ShouldDraw();
virtual bool ShouldUpdate();
virtual void Update(void);
virtual void Draw(void);
virtual void Dispose();
protected:
virtual void RegisterEventSources();
virtual void Initialize();
private:
bool InitializeAllegro();
private:
ALLEGRO_DISPLAY *m_Display;
ALLEGRO_EVENT_QUEUE *m_EventQueue;
ALLEGRO_TIMER *m_Timer;
ALLEGRO_EVENT m_Event;
list<CComponent> *m_Components;
//CComponent *m_Components[MAX_COMPONENTS];
bool m_bIsRunning;
bool m_bShouldDraw;
;
#endif // _CGAME_H
并且,“CGame.h”中声明和定义了“class CGame”,所以我真的不明白为什么......
【问题讨论】:
你能把CGame.h的内容贴出来吗? 也许错误是之前#include "ccomponent.h"
?
这并不能真正回答您的问题,但鉴于当前声明 CComponent
您不需要 #include "CGame.h"
- 您可以转发声明 class CGame;
好了,将 CGame.h 的内容添加到 OP
您不应以 _
开头包含保护名称。虽然这不是导致此问题的原因,但如果使用这样的保留名称碰巧与系统标头中的某些内容发生冲突,则可能会导致类似的问题。
【参考方案1】:
您的标题尝试相互#include - 您不能那样做。从组件头中移除游戏头的#include,改为使用CGame的前向声明。
CComponent(class CGame &game);
在设计方面,这样的问题通常意味着你有问题。我认为组件不太可能知道它们所属的游戏。
【讨论】:
最简单的解决方案是转发声明 CGame -class CGame;
- 而不是 #include "CGame.h"
是的,解决了。 :) 非常感谢。一直让我头疼,呵呵。【参考方案2】:
看起来 CGame.h 是先编译的。所以想象一下步骤
-
CGame.h 开始编译
CComponent.h 被包含
CComponent.h 因被包含而开始编译
CGame.h 已包含,但由于 #pragma once 被跳过(已在步骤 1 中开始)
错误:CGame 是未定义的符号
解决方案:去掉包含,替换为前向声明。你在 CGame.h 中转发声明 CComponent,在 CComponent.h 中做相反的事情(转发声明 CGame)
【讨论】:
以上是关于未知原因的编译器错误 (C++)的主要内容,如果未能解决你的问题,请参考以下文章