2011-10-31 124 views
5

我有以下.proto文件:協議緩衝區:枚舉問題

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

當我嘗試使用comile它protoc,我得到以下錯誤:

proto.proto:19: 5:「X」已被定義爲proto.proto:19:5:請注意,枚舉值使用C++作用域規則,這意味着枚舉值爲 類型的兄弟,而不是它的子類。因此,「X」必須是 唯一的,不只是在「Enum2」中。

我有什麼辦法可以解決這個問題!

+1

重命名'Enum2.X'? – nfechner

+0

你的意思是重命名X @ Enum2!如果ys,我現在不能對應用程序進行依賴, – Echo

+0

您有兩個相同的枚舉實例,X. – John

回答

0

代替

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

我想你應該有類似

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

編輯:您標記這是Java的,但在這個問題你是指C++,女巫一個它是什麼?

EDIT2: google搜索了一下後,我發現這個http://www.mail-archive.com/[email protected]/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;  
} 

,如果你真的是因爲應用程序依賴我猜你需要以某種方式重新設計你的程序..

+0

我使用Java,但是當我使用protoc編譯器編譯我的.proto文件時,出現錯誤I提到。 – Echo

+0

但是就這樣你提到,Enum1將永遠具有enum1.Y的價值....還有其他建議! – Echo

+0

編輯我的答案希望有所幫助 – RagnaRock

4

你可以包括另一個消息中的枚舉所以能見度不會發生衝突的傾斜。

例:

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