VS2012编译器错误C2143:缺少;以前*

Vs2012 compiler error C2143 : missing ; before *

本文关键字:以前 缺少 编译器 错误 C2143 VS2012      更新时间:2023-10-16

运气好的话,这可能是一些非常明显的东西从我身边溜走,但我已经在 C2143 上挣扎了一段时间,我被难住了。

game.h(21): error C2143: syntax error : missing ';' before '*'
game.h(21): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

游戏.h

#ifndef GAME_H_
#define GAME_H_
#include <irrlicht.h>
using namespace irr;
using namespace irr::core;
using namespace irr::scene;
using namespace irr::video;
using namespace irr::io;
using namespace irr::gui;
#include <iostream>
#include "CInput.h"
#include "CAssets.h"
using namespace rtsirr;
IrrlichtDevice *device = 0;
IVideoDriver *driver = 0;
ISceneManager *manager = 0;
CAssets *assets = 0; // Line 21, error here
#endif

CAssets.h

#ifndef ASSETS_H_
#define ASSETS_H_
#include "Game.h"
namespace rtsirr {
class CAssets
{
public:
    CAssets();
    virtual ~CAssets();
    ITexture* getTexture(stringw name);
    IMesh* getMesh(stringw name);
    IAnimatedMesh* getAnimatedMesh(stringw name);
    void load();
private:
    map<stringw, ITexture *> *textures;
    map<stringw, IMesh *> *meshes;
    map<stringw, IAnimatedMesh *> *animatedMeshes;
};
}
#endif

似乎 CAsset 没有被识别为有效类型,但我无法弄清楚为什么。导致问题的原因是什么?

谢谢。

你的包含中有一个循环依赖关系Game.h包括CAssets.h,而又包括Game.h,甚至还没有定义CAssets。预处理器的结果会有所不同,具体取决于包含的顺序。

从您的示例代码来看,除了类型之外,Game.h似乎并不需要了解太多CAssets。您可以将包含CAssets.h替换为前向声明:

class CAssets;

您甚至可以提供一个仅执行此操作的CAssets_fwd.h。否则,您将需要打破这两个标头之间的循环依赖关系