我有以下.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:注意 枚举值使用C ++作用域规则,这意味着枚举值是 他们的兄弟姐妹,而不是孩子。因此,“X”必须是 独特,不仅仅在“Enum2”中。
我有办法克服这个问题!
答案 0 :(得分:6)
您可以在另一条消息中包含您的枚举,以便可见性不会发生冲突。
例如:
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;
}
答案 1 :(得分:0)
而不是
message SomeClass{
required Enum1 enum1=1;
required Enum2 enum2=2; }
我认为你应该有像
这样的东西message SomeClass{
required Enum1 enum1.Y;
required Enum2 enum2.Z;
}
编辑:你把它标记为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;
}
如果您因为应用程序依赖性而无法解决,我猜您需要以某种方式重新设计您的程序..
答案 2 :(得分:0)
您可以在枚举中使用前缀,然后
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;
}