2011-10-31 13 views
5

ho il seguente file Proto:Protocollo Buffer: Enum problema

enum Enum1{ 
    X=0; 
    Y=1;  
} 
message SomeClass{ 
    required Enum1 enum1=1; 
    required Enum2 enum2=2; 
} 
enum Enum2{ 
    X=0; 
    Z=1;  
} 

Quando provo a comile utilizzando ProtoC, ottengo il seguente errore:

proto.proto: 19: 5: "X" è già definito proto.proto: 19: 5: si noti che i valori enum di utilizzano le regole di ambito C++, il che significa che i valori enum sono di tipo di loro tipo, non figli di esso. Pertanto, "X" deve essere univoco, non solo all'interno di "Enum2".

Posso risolvere questo problema in qualsiasi modo!

+1

Rinomina 'Enum2.X'? – nfechner

+0

Significa che si rinomina X @ Enum2 !! se sì, non posso in questo momento esserci dipendenza su di esso sull'applicazione, – Echo

+0

Hai due stesse istanze di enumerazione, X. – John

risposta

0

invece di

message SomeClass{ 
required Enum1 enum1=1; 
required Enum2 enum2=2; } 

Credo che si dovrebbe avere qualcosa come

message SomeClass{ 
    required Enum1 enum1.Y; 
    required Enum2 enum2.Z; 
} 

edit: hai contrassegnato questo come Java, ma alla domanda che fare riferimento a C++, strega uno è?

EDIT2: Dopo googling un po 'ho trovato questo http://www.mail-archive.com/[email protected]/msg04986.html

è necessario rinominare o enum1.X enum2.x a qualche altro nome in modo che essi non siano in conflitto.

enum Enum1{ 
    W=0; 
    Y=1;  
} 
message SomeClass{ 
    required Enum1 enum1=1; 
    required Enum2 enum2=0; 
} 
enum Enum2{ 
    X=0; 
    Z=1;  
} 

se è davvero impossibile a causa delle dipendenze applicative Credo che avete bisogno di riprogettare il vostro programma in qualche modo ..

+0

Io uso Java ma quando compilo il mio file .proto usando il compilatore di protoc, ottengo l'errore I menzionato. – Echo

+0

Ma in questo modo hai menzionato, Enum1 avrà sempre il valore di enum1.Y .... ci sono altri suggerimenti !! – Echo

+0

modificato la mia risposta spero che aiuti – RagnaRock

4

Si potrebbe includere il tuo enum all'interno di un altro messaggio in modo che la visibilità non sarà in conflitto.

Esempio:

message Enum1{ 
enum Enum{ 
    X=0; 
    Y=1;  
} 
} 

message Enum2{ 
enum Enum{ 
    X=0; 
    Y=1;  
} 
} 

message SomeClass{ 
    required Enum1.Enum enum1=1; 
    required Enum2.Enum enum2=0; 
} 

Si potrebbe anche far precedere il vostro valore enum con qualcosa. Se non si modifica il numero dopo il nome del valore, esso dovrebbe rimanere compatibile con la vecchia versione: es:

enum Enum1{ 
    E1_X=0; 
    E1_Y=1;  
} 
enum Enum2{ 
    E2_X=0; 
    E2_Z=1;  
} 
message SomeClass{ 
    required Enum1 enum1=1; 
    required Enum2 enum2=2; 
} 
Problemi correlati