2012-12-22 12 views
6

Sto usando una libreria che ha una sola differenza tra piattaforme/versioni. Una versione chiama la classe btCollisionObject e altre versioni lo chiamano btCollisionObjectWrapper. Se potessi fare in modo che questa classe avesse due nomi che fanno ancora riferimento a quella classe, allora tutti i miei problemi sarebbero risolti. Ho provato: #define btCollisionObject btCollisionObjectWrapper; ma non funziona. Qual è il modo corretto di assegnare due nomi di classe dopo che la classe è stata definita?Come fare che una classe abbia due nomi?

+9

Potrebbe essere perché hai un punto e virgola nel tuo #define, che (molto probabilmente) non dovrebbe essere lì? –

risposta

11

Forse

typedef btCollisionObjectWrapper btCollisionObject; 

meglio farlo utilizzando strumenti linguistici invece del preprocessore.

+0

errore C2371: 'btCollisionObjectWrapper': ridefinizione; diversi tipi di base – SteveDeFacto

+0

@SteveDeFacto Perché stai utilizzando entrambe le versioni della libreria contemporaneamente? –

+0

@SteveDeFacto: Immagino che volevi farlo in un altro modo, allora? –

7

Se ho capito bene il tuo problema, dovrai trovare un modo per determinare quale piattaforma stai compilando, perché non so quali piattaforme stai usando Non posso dare alcun consiglio su questo, ma probabilmente è possibile farlo tramite macro.

La soluzione al tuo problema sarà probabilmente simile a questa.

In C++ 98 utilizzando una dichiarazione tipo

#ifdef __PLATFORM_SPECIFIC_DEFINE 
    typedef btCollisionObjectWrapper btCollisionObject; 
#endif 

In C++ 11 utilizzando una dichiarazione alias, ciò ha il vantaggio che essi possono essere usati con i modelli tuttavia nel caso potresti cavartela con un semplice typedef.

#ifdef __PLATFORM_SPECIFIC_DEFINE 
    using btCollisionObject = btCollisionObjectWrapper; 
#endif 

Questo vi permetterà di utilizzare btCollisionObject come il nome della classe per la piattaforma che utilizza btCollisionObjectWrapper

Sarà ovviamente necessario sostituire la __PLATFORM_SPECIFIC_DEFINE con una macro che viene definito dalla piattaforma che utilizza btCollisionObjectWrapper.

+1

hanno anche il vantaggio di essere più "simili a C++" in quanto enfatizzano i tipi in contrasto con le espressioni nel modo in cui la sintassi della dichiarazione C enfatizza le espressioni. – bames53

+0

Voglio sapere esattamente qual è la differenza tra un'istruzione 'typedef' e una' using'. Puoi indicarmi un sito web/qualunque cosa, il che spiega la differenza? Lo farà anche un'espressione di ricerca su google che porta al risultato corretto. – leemes

+1

Non sono al 100% su tutte le differenze in quanto non l'ho mai visto io stesso, l'unica differenza menzionata su [cppreference] (http://en.cppreference.com/w/cpp/language/typedef) dove ho appreso della 'dichiarazione alias' è che può essere usato quando si crea un alias di un modello. – ctor

Problemi correlati