Протокол буфера: проблема Enum - PullRequest
13 голосов
/ 31 октября 2011

У меня есть следующий файл .proto:

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

Когда я пытаюсь скомпилировать его с помощью protoc, я получаю следующую ошибку:

proto.proto: 19: 5: «X» уже определено proto.proto: 19: 5: Обратите внимание, что значения enum используют правила области видимости C ++, что означает, что значения enum родные братья их типа, не дети этого. Следовательно, «Х» должен быть уникальный, не только внутри "Enum2".

Я как-нибудь смог преодолеть эту проблему!

Ответы [ 2 ]

8 голосов
/ 11 декабря 2012

Вы можете включить ваше перечисление в другое сообщение, чтобы видимость не вступала в конфликт.

Пример:

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

Вы могли бы также поставить префикс вашего значения перечисления чем-то.Если вы не измените число после имени вашего значения, оно должно оставаться совместимым с вашей старой версией: например:

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;
}
0 голосов
/ 31 октября 2011

вместо

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

я думаю, у тебя должно быть что-то вроде

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

edit: вы отметили это как Java, но в вопросе, который вы ссылаетесь на c ++, ведь это так?

edit2: Немного погуглив, я нашел это http://www.mail-archive.com/protobuf@googlegroups.com/msg04986.html

вам нужно переименовать enum1.X или enum2.x в другое имя, чтобы они не конфликтовали.

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

если вы действительно не можете этого сделать из-за зависимостей приложений, я думаю, вам нужно каким-то образом переделать вашу программу ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...