2016-05-24 2 views
1

Я программирую в C++ для gta-модов. Поэтому я использую ScriptHook V.C++ typedefs сталкиваются с классами

В 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 
... 

Теперь я хотел сделать класс игрока. Но продолжайте получать именования конфликтов, и я не могу найти хорошее решение для их решения, а затем переименовать мои классы. Есть ли другой способ? Мои классы находятся в пространстве имен, но они конфликтуют.

+0

Являются ли typedefs в пространстве имен? – NathanOliver

+4

Независимо от того, 'typedef DWORD Void;' выглядит сомнительным? – Barry

+0

нет, typedefs не находятся в пространстве имен – stulleman

ответ

1

Существует 2 возможных решения.

  1. Поставьте определения типов в их собственном пространстве имен
  2. Используйте scope resolution operator дифференцировать

Оба решения требуют, чтобы Вы поместили свой код в своих собственном пространстве имен, как это эти пространства имен, которые мы должны использовать для устранения двусмысленности.

В следующих примерах я решил назвать пространство имен, в которое вы поместили свой собственный код, в MyCode - вы можете использовать любое пространство имен, которое вы хотите, до тех пор, пока оно уникально.

Решение 1:

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

Решение 2:

Если определения типов имеет быть в глобальном пространстве имен, то оператор разрешения области видимости может быть использован, чтобы дифференцировать их

typedef int Player; 

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

S ee this SO answer для получения дополнительной информации о операторе разрешения области действия

+0

Хорошо, по крайней мере, ваш второй ответ работает, но я тоже пытаюсь заставить первого работать. Когда я добавляю пространство имен вокруг typedefs, я добавляю использование типов пространств имен в natives.h. Но тогда он говорит, что имя игрока равнозначно – stulleman

+0

@stulleman первое решение - это более аккуратное решение - так что должно быть предпочтительнее. Если это не работает для вас, вы уверены, что префикс вашего typedefs с пространством имён? –

+0

@stulleman re your edit в вашем комментарии о добавлении 'using namespace Types', который определенно ** не означает, что это путь, и это точная причина для двусмысленности.Удалите 'using namespace Types' и обратитесь к любому' typedef' в вашем коде как 'Types :: Player' и т. Д. –

0

Возможно, вы имели в виду typedef DWORD Uint;, а не typedef DWORD uint;, поскольку последний может вызвать конфликт имен с общим типедефом в Posix.

+0

В '' cstdint'' нет 'uint'. – PcAF

+2

@PcAF Проверьте [это] (http://ideone.com/pxknrA) –

+1

О, для меня (g ++ 4.8.1) он отлично работает. Кстати, стандарт C++ (18.4.1) не содержит упоминания о 'uint'. – PcAF

Смежные вопросы