27

I have the following .proto file :

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

When I try to comile it using protoc , I get the following error :

proto.proto:19:5: "X" is already defined proto.proto:19:5: Note that enum values use C++ scoping rules, meaning that enum values are siblings of their type, not children of it. Therefore, "X" must be unique , not just within "Enum2".

I there any way I could overcome this issue !

Echo
  • 2,959
  • 15
  • 52
  • 65

3 Answers3

37

You could include your enum inside another message so the visibility will not conflict.

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

You could also prefix your enum value with something. If you don't change the number after the name of your value, it should stay compatible with your old version : 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;
}
Mike
  • 2,354
  • 3
  • 23
  • 37
1

You can use prefix in enumeration then

enum Enum1{
    E1_X=0;
    E1_Y=1;    
}
message SomeClass{
    required Enum1 enum1=1;
    required Enum2 enum2=2;
}
enum Enum2{
    E2_X=0;
    E2_Z=1;    
}
Jiancong
  • 67
  • 1
  • 7
0

instead of

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

i think you should have something like

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

edit: you tagged this as Java, but in the question you refer to c++, witch one it is?

edit2: After googling a bit I found this http://www.mail-archive.com/protobuf@googlegroups.com/msg04986.html

you need to rename enum1.X or enum2.x to some other name so that they don't conflict.

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

if you really cant because of application dependencies i guess you need to redesign your program somehow..

RagnaRock
  • 2,432
  • 7
  • 34
  • 56
  • I use Java but when I compile my .proto file using the protoc compiler , I get the error I mentioned . – Echo Oct 31 '11 at 11:04
  • But in this way u mentioned , Enum1 will always have the value of enum1.Y .... is there other suggestions !! – Echo Oct 31 '11 at 11:06