错误C2061:语法错误:标识符,但已包含头文件

ryf*_*059 1 c++ syntax-error identifier

我有一个很棒的游戏引擎来编译,它工作正常,直到我做了一些疯狂的调整.编译器莫名其妙地无法重新调整我的意思是Game对象并产生error C2061: syntax error : identifier 'Game',而且似乎无论我编译什么文件,错误总是指向一个名为GameDataLoader.h甚至没有与这两个文件连接的文件.通常我认为这是一个包含问题,但事实是我已经Game.h包含在每个.h文件中,包含stdafx.h之后,我已经#pragama once在它之上了.我考虑过循环包含问题,但#pragma once应该注意这一点.此外,这个包含指令工作正常,直到我更改了一些文件名和其他杂乱的东西.我清理了整个解决方案并尝试重建它但仍然没有运气(使用VS2012).我不知道显示代码是否有帮助,但这里是代码gameDataLoader.h.这不是我写的文件,但它应该正常工作.

#pragma once
#include "stdafx.h"
#include "Game\Game.h" // Game.h included

class GameDataLoader
{
public:
    GameDataLoader(){} 
    ~GameDataLoader(){}

void GameDataLoader::loadGameProperties( Game *game, map<wstring, wstring> *properties, wstring gameInitFile);

    virtual void loadGame(Game *game, wstring gameInitFile) = 0;
    virtual void loadGUI(Game *game, wstring guiInitFile) = 0;
    virtual void loadWorld(Game *game, wstring levelInitFile) = 0;
};
Run Code Online (Sandbox Code Playgroud)

我在游戏对象的4行中确实存在错误.可能是什么问题?双重包含?圆形包含?或者没有包含某些东西和其他地方?

Mik*_*our 11

最有可能的Game.hGameDataLoader.h,直接或间接地包括创建循环依赖; 但你忘了向我们展示Game.h,所以我无法确定.

如果是这种情况,那么#pragma once(或等效的包括警卫)将意味着其中一个标题将被包含在另一个之前,而第二个标题的声明将不可用于第一个标题.它不会在彼此之前神奇地包含它们,因为这是不可能的.

幸运的是,GameDataLoader.h不需要完整的定义Game,因为它只处理它的指针.所以你可以删除包含Game.h而只是声明class Game;.