2016-05-24 36 views
1

Ich programmiere in C++ für GTA Mods. Deshalb verwende ich ScriptHook V.C++ typedefs kollidiert mit Klassen

In types.h gibt es diese:

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; 

Und die natives.h verwendet diese Typen:

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

Jetzt wollte ich eine Klasse Spieler machen. Aber immer wieder Namenskonflikte und ich kann keine andere Lösung finden, um sie zu lösen, als meine Klassen umzubenennen. Gibt es eine andere Art und Weise? Meine Klassen befinden sich in einem Namespace, aber es bleibt in Konflikt.

+0

Sind die typedefs in einem Namespace? – NathanOliver

+4

Unabhängig davon, 'typedef DWORD Void;' sieht fraglich aus? – Barry

+0

nein, die typedefs sind nicht in einem Namespace – stulleman

Antwort

1

Es gibt 2 mögliche Lösungen dafür.

  1. Setzen Sie Ihren typedefs in ihrem eigenen Namensraum
  2. die scope resolution operator Verwenden

Beiden Lösungen Sie Ihren Code in einem eigenen Namensraum setzen erfordern zu unterscheiden, da sie diese Namensräume, die wir verwenden müssen um die Mehrdeutigkeit aufzulösen.

In den folgenden Beispielen habe ich gewählt, den Namespace aufzurufen, in dem Sie Ihren eigenen Code eingeben würden: MyCode - Sie können einen beliebigen Namespace verwenden, solange dieser eindeutig ist.

Lösung 1:

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

Lösung 2:

Wenn Ihr typedefs im globalen Namespace sein, dann wird der Bereichsauflösungsoperator kann verwendet werden, um sie

zu unterscheiden
typedef int Player; 

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

S ee this SO answer für weitere Informationen über den Scope-Auflösung-Operator

+0

Okay, zumindest funktioniert deine zweite Antwort, aber ich versuche, die erste auch zu bekommen. Wenn ich einen Namespace um die Typedefs hinzufüge, füge ich einen using Namespace Types in natives.h hinzu. Aber dann heißt es der Name Player ist ambig – stulleman

+0

@stulleman die erste Lösung ist die sauberere Lösung - sollte also bevorzugt werden. Wenn es für Sie nicht funktioniert, sind Sie sicher, dass Sie Ihren Typdefinitionen den Namensraum voranstellen, in dem sie sich befinden? –

+0

@stulleman re Bearbeiten Sie in Ihrem Kommentar über das Hinzufügen eines 'mit Namespace-Typen', das ist definitiv ** nicht ** der Weg zu gehen, und das ist der genaue Grund für die Ambiguität.Entfernen Sie die 'using namespace Types' und beziehen Sie sich auf' typedef' in Ihrem Code als 'Types :: Player' etc –

0

Wahrscheinlich meinten Sie typedef DWORD Uint; nicht typedef DWORD uint; als letzteres könnte Namenskonflikt mit einem gemeinsamen Typdef in Posix sys/types.h verursachen.

+0

Es gibt kein 'uint' in' cstdint' Header. – PcAF

+2

@PcAF Check [this] (http://ideone.com/pxknrA) –

+1

Oh, für mich (g ++ 4.8.1) funktioniert es gut. Der C++ - Standard (18.4.1) enthält übrigens keine Erwähnung von "Uint". – PcAF