2011-10-31 7 views
5

tengo el siguiente archivo .proto:de búfer de protocolo: Enumeración tema

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

Cuando intento comilla usando protoc, me sale el siguiente error:

proto.proto: 19: 5: "X" ya está definido proto.proto: 19: 5: tenga en cuenta que los valores de enum utilizan reglas de ámbito de C++, lo que significa que los valores enum son hermanos de su tipo, no hijos de él. Por lo tanto, "X" debe ser único, no solo dentro de "Enum2".

¡De alguna manera podría superar este problema!

+1

Cambiar nombre 'Enum2.X'? – nfechner

+0

¡¿Quieres decir renombrar X @ Enum2 !! si ys, no puedo ahora mismo porque existe dependencia en la aplicación, – Echo

+0

Tiene dos instancias enum iguales, X. – John

Respuesta

0

en lugar de

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

creo que debe tener algo como

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

edición: ha etiquetado esto como Java, pero en la pregunta que se refieren a C++, una bruja que es?

Edit2: Tras Google un poco me encontré con este http://www.mail-archive.com/[email protected]/msg04986.html

necesita cambiar el nombre o enum1.X enum2.x a algún otro nombre para que no entren en conflicto.

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

si realmente no puede debido a las dependencias de aplicación Creo que se necesita rediseñar su programa de alguna manera ..

+0

Utilizo Java pero cuando compilo mi archivo .proto usando el compilador de protocolos, obtengo el error I mencionado. – Echo

+0

Pero de esta manera usted mencionó, Enum1 siempre tendrá el valor de enum1.Y .... ¿hay otras sugerencias? – Echo

+0

editado mi respuesta espero que ayude – RagnaRock

4

Se podría incluir a su enumeración dentro de otro mensaje para que la visibilidad no entren en conflicto.

Ejemplo:

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; 
} 

También puede prefijar el valor de enumeración con algo. Si usted no cambia el número después del nombre de su valor, se debe mantener la compatibilidad con la versión antigua: ejemplo:

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; 
} 
Cuestiones relacionadas