"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.h
和 RandomNumber.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
};
我在同一个 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.h
和 RandomNumber.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
};