未知原因的编译器错误 (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++)的主要内容,如果未能解决你的问题,请参考以下文章

[C++] 常见编译运行错误总结

c++ - 错误 C3646:未知的覆盖说明符

在Android环境下编译调用c++出现以下错误,大神们这是啥原因呀??我已经配置NDK了。

使用 Linux g++ 编译带有附加库的 c++ 程序

CodeLite - 构建设置故障

使用用于 C++ 代码的标头编译 C 代码时未知类型名称 char16_t