C ++ typedef与类冲突

时间:2016-05-24 15:19:42

标签: c++ namespaces typedef collision naming

我用c ++编程为gta mods编程。因此我使用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
...

现在我想制作一个Player类。但不断发现命名冲突,我找不到一个好的解决方案来解决它们,然后重命名我的类。还有另外一种方法吗?我的类在命名空间中,但它保持冲突。

2 个答案:

答案 0 :(得分:1)

有两种可能的解决方案。

  1. 将您的typedef放入自己的命名空间
  2. 使用scope resolution operator区分
  3. 这两种解决方案都要求您将代码放在自己的命名空间中,因为我们必须使用这些命名空间来解决歧义。

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

    解决方案1:

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

    解决方案2:

    如果你的typedef 在全局命名空间中,那么范围解析运算符可用于区分它们

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

    有关范围解析运算符

    的更多信息,请参阅this SO answer

答案 1 :(得分:0)

您可能认为typedef DWORD Uint;不是typedef DWORD uint;,因为后者可能会导致名称与Posix sys/types.h中的常见typedef冲突。