2011-10-31 26 views
5

Tôi có tập tin .proto sau:Nghị định thư Buffer: Enum vấn đề

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

Khi tôi cố gắng comile nó bằng cách sử protoc, tôi nhận được lỗi sau:

proto.proto: 19: 5: "X" đã được định nghĩa proto.proto: 19: 5: Lưu ý rằng các giá trị enum enum sử dụng quy tắc phạm vi C++, có nghĩa là giá trị enum là anh chị em của loại của chúng, không phải là con của nó. Do đó, "X" phải là duy nhất, không chỉ trong "Enum2".

Tôi có cách nào để khắc phục vấn đề này!

+1

Đổi tên 'Enum2.X'? – nfechner

+0

Bạn muốn đổi tên X @ Enum2 !! nếu ys, tôi không thể ngay bây giờ khi có sự phụ thuộc vào nó trên ứng dụng, – Echo

+0

Bạn có hai trường hợp tương tự nhau, X. – John

Trả lời

0

thay vì

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

tôi nghĩ rằng bạn nên có cái gì đó như

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

chỉnh sửa: bạn gắn thẻ này như Java, nhưng trong câu hỏi bạn tham khảo C++, phù thủy một nó là gì?

edit2: Sau khi googling một chút Tôi thấy điều này http://www.mail-archive.com/[email protected]/msg04986.html

bạn cần phải đổi tên enum1.X hoặc enum2.x đến một số tên khác để họ không xung đột.

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

nếu bạn thực sự không thể vì phụ thuộc ứng dụng tôi đoán bạn cần phải thiết kế lại chương trình của bạn bằng cách nào đó ..

+0

Tôi sử dụng Java nhưng khi tôi biên dịch tệp .proto bằng trình biên dịch protoc, tôi nhận được lỗi I đề cập . – Echo

+0

Nhưng theo cách này bạn đã đề cập, Enum1 sẽ luôn có giá trị của enum1.Y .... là có những gợi ý khác !! – Echo

+0

đã chỉnh sửa câu trả lời của tôi hy vọng rằng sẽ giúp – RagnaRock

4

Bạn có thể bao gồm enum của bạn bên trong thông điệp khác để khả năng hiển thị sẽ không xung đột.

dụ:

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

Bạn cũng có thể thêm tiền tố giá trị enum của bạn với một cái gì đó. Nếu bạn không thay đổi số sau tên của giá trị, nó sẽ vẫn tương thích với phiên bản cũ của bạn: ví dụ:

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; 
} 
Các vấn đề liên quan