"error C2065: undeclared identifier" 来自另一个标头的枚举

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

本文关键字:另一个 枚举 error C2065 undeclared identifier      更新时间:2023-10-16

我在同一个头文件中构建了一个类,认为它会很小,因为我的代码开发过程中需要将它放入多个头/cpp文件中。我的数据结构依赖于一个枚举,该枚举现在包含在另一个头文件中。编译器抱怨。

错误C2653:"EnumBox":不是类或命名空间名称

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

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

当它们都是在同一个头文件中使用我的枚举的类时,它就起作用了。发生了什么事?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 "..ConsoleApplication1RandomNumber.h"
#include "..ConsoleApplication1PlayerName.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};

您有两个标头试图相互包含。删除任何不需要的#include;并在可能的情况下尝试用正向声明来替换它们。

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

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

这篇文章帮助很大:将枚举放在cpp程序中的何处?

在上面的帖子之后,我制作了一个普通的.h类。

#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
};