2

運が良ければ、それはおそらく私をすり抜けた非常に明白な何かですが、私はかなり長い間 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

CAssets が有効な型として認識されていないようですが、理由がわかりません。問題の原因は何ですか?

ありがとう。

4

1 に答える 1

3

includes に循環依存関係があります。define を取得する前に、次に include が含まれます。プリプロセッサからの結果は、インクルードの順序によって異なります。Game.hCAssets.hGame.hCAssets

あなたのサンプルコードから、それがタイプであること以外はGame.hあまり知る必要がないようです。の組み込みを前方宣言CAssetsに置き換えることができます。CAssets.h

class CAssets;

それだけを行う を提供することもできますCAssets_fwd.h。それ以外の場合は、これら 2 つのヘッダー間の循環依存を解消する必要があります。

于 2012-12-23T23:48:04.660 に答える