“错误C2065:未声明的标识符”包含来自另一个标头的枚举

时间:2015-02-18 15:31:48

标签: c++ enums extern

我正在同一个头文件中构建一个类,认为它会很小,因为我的代码开发后需要将它放入多个头文件/ 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 "..\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};

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

这篇文章帮助极大: Where to put the enum in a cpp program?

按照上面的帖子,我做了一个common.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
};