"error C2065: undeclared identifier" 枚举来自另一个 header

"error C2065: undeclared identifier" Enum inclusion from another header

我在同一个 header 文件中构建一个 class,认为它会很小,因为我的代码开发需要将它放入多个 header/cpp 文件中。我的数据结构依赖于现在包含在另一个 header 文件中的枚举。编译器报错。

error C2653: 'EnumBox' : 不是 class 或命名空间名称

错误 C2065:'PLAYERNAME':未声明的标识符

错误 C2065:'RANDOMNUMBER':未声明的标识符

当使用我的枚举的所有 class 都在同一个 header 文件中时,它起作用了。到底是怎么回事? Extern 似乎不适用于枚举。

GameDataNetworkHelper.h

#pragma once
#ifndef GAMEDATANETWORKHELPER_H
#define GAMEDATANETWORKHELPER_H
#include "../RakNetP2PExample/NetworkHelper.h"
#include "../GameExample/NumberGuesser.h"
#include "BitStream.h"
#include "../RakNetP2PExample/GameData.h"
#include "..\ConsoleApplication1\RandomNumber.h"
#include "..\ConsoleApplication1\PlayerName.h"
class NumberGuesser;
class NetworkHelper;

class EnumBox
{
public:
static const enum GameDataType {GAMEDATA = 0, PLAYERNAME=1, RANDOMNUMBER=2};
};


//..some code which uses RandomNumber, and PlayerName



#endif

和RandomNumber.h

    #pragma once

    #ifndef RANDOMNUMBER_H
    #define RANDOMNUMBER_H
    #include "../RakNetP2PExample/NetworkHelper.h"
    #include "../GameExample/NumberGuesser.h"
    #include "BitStream.h"
    #include "../RakNetP2PExample/GameData.h"
    #include "GameDataNetworkHelper.h"
    class RandomNumber : public GameData
    {
    public:
    static const int randomNumberType = EnumBox::GameDataType::RANDOMNUMBER;

    //.. some other code
   };


#endif

PlayerName.h

#pragma once
#ifndef PLAYERNAME_H
#define PLAYERNAME_H
#include "../RakNetP2PExample/NetworkHelper.h"
#include "../GameExample/NumberGuesser.h"
#include "BitStream.h"
#include "../RakNetP2PExample/GameData.h"
#include "GameDataNetworkHelper.h"
class PlayerName : public GameData
{

public:
    static const int playerNameType = EnumBox::PLAYERNAME;
    //...some other code

};
#endif

我也试过了 extern enum GameDataType {GAMEDATA =0, PLAYERNAME, RANDOMNUMBER};

您有两个 header 试图相互包含。删除不需要的 #include;并尽可能用前向声明替换它们。

特别是想办法阻止 GameDataNetworkHelper.hRandomNumber.h 相互包容。除非 RandomNumber 正在做一些非常奇怪的事情,否则它不应该依赖于游戏、数据或网络。也许您可以将 EnumBox 移动到一个单独的 header 中,这样它只需要包含它。

这很奇怪,但它不喜欢它与 GamaDataNetworkHelper 在同一个文件中 class。

这个 post 帮助很大: Where to put the enum in a cpp program?

按照上面的post,我做了一个common.h class.

#ifndef COMMON_H
#define COMMON_H
enum GameDataType {GAMEDATA = 0, PLAYERNAME=1, RANDOMNUMBER=2};
#endif

然后更新两个派生类型。

    class RandomNumber : public GameData
    {
    public:
        static const int randomNumberType = RANDOMNUMBER;
        int randomNumb;
        int maxNumber;

        RandomNumber()
        {
            type = randomNumberType;
        }
        ~RandomNumber()
        {

        }
//... continues
};