C++ 类型定义与 类 冲突

C++ typedefs colliding with classes

我正在用 C++ 为 gta 模组编程。因此我使用 ScriptHook V.

在types.h中有这个:

typedef DWORD Void;
typedef DWORD Any;
typedef DWORD uint;
typedef DWORD Hash;
typedef int Entity;
typedef int Player;
typedef int FireId;
typedef int Ped;
typedef int Vehicle;
typedef int Cam;
typedef int CarGenerator;
typedef int Group;
typedef int Train;
typedef int Pickup;
typedef int Object;
typedef int Weapon;
typedef int Interior;
typedef int Blip;
typedef int Texture;
typedef int TextureDict;
typedef int CoverPoint;
typedef int Camera;
typedef int TaskSequence;
typedef int ColourIndex;
typedef int Sphere;
typedef int ScrHandle;

而 natives.h 使用这种类型:

namespace PLAYER
{
static Ped GET_PLAYER_PED(Player player) { return invoke<Ped>    (0x43A66C31C68491C0, player); } // 0x43A66C31C68491C0 0x6E31E993
static Ped GET_PLAYER_PED_SCRIPT_INDEX(Player player) { return invoke<Ped>(0x50FAC3A3E030A6E1, player); } // 0x50FAC3A3E030A6E1 0x6AC64990
...

现在我想制作一个播放器 class。但是不断出现命名冲突,除了重命名我的 classes 之外,我找不到好的解决方案来解决它们。还有别的办法吗?我的 classes 在命名空间中,但它一直存在冲突。

您的意思可能是 typedef DWORD Uint; 而不是 typedef DWORD uint;,因为后者可能会导致名称与 Posix 的 sys/types.h.

中的常见类型定义发生冲突

对此有 2 种可能的解决方案。

  1. 将你的 typedef 放在它们自己的命名空间中
  2. 使用scope resolution operator区分

这两种解决方案都要求您将代码放在自己的命名空间中,因为我们必须使用这些命名空间来解决歧义。

在以下示例中,我选择调用您将自己的代码放入 MyCode 中的名称空间 - 您可以自由使用任何您想要的名称空间,只要它是唯一的即可。

解决方案一:

namespace Type 
{
    typedef int Player;
}
namespace MyCode
{
    class Player
    {
        Player(Type::Player id); // here you specify the namespace "Type" 
    };
}

方案二:

如果您的 typedef 位于全局命名空间中,则可以使用范围解析运算符来区分它们

typedef int Player;

namespace MyCode
{
    class Player
    {
        Player(::Player id); // here "::Player" refers to the typedef
    };
}

有关范围解析运算符的更多信息,请参见this SO answer