2013-05-27 22 views
8

Tôi đang gặp vấn đề với điều tra viên. Đừng lãng phí thời gian của bất cứ ai, và đi thẳng vào nó. Lỗi:Định nghĩa lại và ĐTV số

1> forgelib\include\forge\socket.h(79): error C2365: 'RAW' : redefinition; previous definition was 'enumerator' 
1>   forgelib\include\forge\socket.h(66) : see declaration of 'RAW' 

Mã:

namespace Forge { 
    enum SocketType { 
     STREAM  = SOCK_STREAM,  // Sequenced, reliable, 2-way 
     DGRAM  = SOCK_DGRAM,  // Connectionless, unreliable 
     RAW   = SOCK_RAW,   // Raw protocol 
     RDM   = SOCK_RDM,   // Reliable-delivered message 
     SEQPACKET = SOCK_SEQPACKET // Sequenced, reliable, 2-way 
    }; 
    enum ProtocolType { 
     IP   = IPPROTO_IP,  // IPv4 
     ICMP   = IPPROTO_ICMP,  // Internet Control Messsage Protocol 
     IGMP   = IPPROTO_IGMP,  // Internet Group Management Protocol 
     GGP   = IPPROTO_GGP,  // Gateway to Gateway Protocol 
     TCP   = IPPROTO_TCP,  // Transmission Control Protocol 
     PUP   = IPPROTO_PUP,  // PARC Universal Packet Protocol 
     UDP   = IPPROTO_UDP,  // User Datagram Protocol 
     IDP   = IPPROTO_IDP,  // Xerox NS Protocol 
     RAW   = IPPROTO_RAW,  // Raw IP Packets 
     IPV6   = IPPROTO_IPV6  // IPv6 
    }; 
} 

gì cho?

Trả lời

12

Bạn không thể có tên bằng nhau trong các enums kiểu c cũ. Nếu bạn có C++ 11 - bạn có thể sử dụng enum class, hằng số tĩnh trong các lớp, các không gian tên khác nhau hoặc bạn có thể chỉ cần sử dụng các tên khác nhau.

Ví dụ với enum classes

enum class SocketType 
{ 
    RAW = SOCK_RAW 
}; 

enum class ProtocolType 
{ 
    RAW = IP_PROTO_RAW 
}; 

ví dụ với constants

struct SocketType 
{ 
    static const int RAW = SOCK_RAW; 
}; 

struct ProtocolType 
{ 
    static const int RAW = IP_PROTO_ROW; 
}; 
+2

Vì vậy, tôi phải đổi tên một trong số họ mặc dù họ đang trong điều tra khác nhau? Thật ngu ngốc như thế. Ngôn ngữ ngu ngốc. Cảm ơn bạn. –

+1

Không, bạn không phải đổi tên chúng. Giải pháp nằm trong câu trả lời của anh ta. – Wilbert

+1

@JesseBrands: Hãy tưởng tượng ngôn ngữ sẽ chấp nhận cấu trúc của bạn, dòng 'int x = RAW; 'sẽ làm gì chính xác? – PlasmaHH

2

Forge::RAW là mơ hồ, nó không được biết nếu điều này là từ loại enum.

Sử dụng phong cách này:

namespace Forge { 
    namespace SocketType { 
     enum Values { 
     STREAM  = SOCK_STREAM,  // Sequenced, reliable, 2-way 
     DGRAM  = SOCK_DGRAM,  // Connectionless, unreliable 
     RAW   = SOCK_RAW,   // Raw protocol 
     RDM   = SOCK_RDM,   // Reliable-delivered message 
     SEQPACKET = SOCK_SEQPACKET // Sequenced, reliable, 2-way 
     }; 
    } 
    namespace ProtocolType { 
     enum Values { 
     IP   = IPPROTO_IP,  // IPv4 
     ICMP   = IPPROTO_ICMP,  // Internet Control Messsage Protocol 
     IGMP   = IPPROTO_IGMP,  // Internet Group Management Protocol 
     GGP   = IPPROTO_GGP,  // Gateway to Gateway Protocol 
     TCP   = IPPROTO_TCP,  // Transmission Control Protocol 
     PUP   = IPPROTO_PUP,  // PARC Universal Packet Protocol 
     UDP   = IPPROTO_UDP,  // User Datagram Protocol 
     IDP   = IPPROTO_IDP,  // Xerox NS Protocol 
     RAW   = IPPROTO_RAW,  // Raw IP Packets 
     IPV6   = IPPROTO_IPV6  // IPv6 
     }; 
    } 
} 
+0

Bạn nghĩ rằng nó có thể tạo nên sự khác biệt giữa Forge :: SocketType :: RAW và Forge :: ProtocolType :: RAW ... nhưng dường như C++ vẫn còn trong thời kỳ đồ đá. –

+0

Trên thực tế, không phải, bạn chỉ chọn không sử dụng các lớp enum. – Wilbert

+0

Sử dụng C++ 11 không phải là một tùy chọn cho dự án này. Nhưng câu trả lời của Piotr sẽ làm, cảm ơn! –

Các vấn đề liên quan