2011-10-31 11 views
5

Mam następujący plik .proto:Protocol Buffer: Enum problem

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

Kiedy próbuję comile go za pomocą protoc, pojawia się następujący błąd:

proto.proto: 19: 5: "X" jest już zdefiniowane proto.proto: 19: 5: Zauważ, że wartości wyliczeniowe używają zasad ustalania zakresu C++, co oznacza, że ​​wartości wyliczeniowe są rodzeństwem tego typu, a nie jego potomkami. Dlatego "X" musi być unikalny, nie tylko w ramach "Enum2".

W każdy sposób mogę rozwiązać ten problem!

+1

Zmień nazwę 'Enum2.X'? – nfechner

+0

Masz na myśli zmianę nazwy X @ Enum2 !! jeśli nie, nie mogę teraz, ponieważ istnieje zależność od niego w aplikacji, – Echo

+0

Masz dwie takie same instancje wyliczeniowe, X. – John

Odpowiedz

0

zamiast

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

myślę, że powinieneś mieć coś takiego

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

EDIT: Państwo określili to jako Java, ale w kwestii odnieść się do C++, czarownica jeden to jest?

Edit2: Po googling trochę znalazłem ten http://www.mail-archive.com/[email protected]/msg04986.html

trzeba zmienić nazwę enum1.X lub enum2.x do innej nazwy, tak że nie są one sprzeczne.

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

jeśli naprawdę nie mogę ze względu na zależności aplikacyjnych Chyba trzeba przeprojektować swój program jakoś ..

+0

Używam Java, ale kiedy kompiluję mój plik .proto przy użyciu kompilatora protoc, pojawia się błąd I wzmiankowany . – Echo

+0

Ale w ten sposób wspominałeś, Enum1 będzie zawsze miał wartość enum1.Y .... czy są inne sugestie !! – Echo

+0

zredagowałem moją odpowiedź mam nadzieję, że pomaga – RagnaRock

4

Można podać swoje wyliczenia wewnątrz innego komunikatu tak widoczności nie będzie konflikt.

Exemple:

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

Można też poprzedzić swoją wartość enum z czymś. Jeśli nie zmienić liczbę po nazwie swojej wartości, powinien on pozostać zgodny ze starym wersji: Ex:

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