2013-05-27 4 views
8

У меня проблема с счетчиками. Не будем тратить время на то, и прямо к нему. Ошибка:Переопределение и перечислитель

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' 

Код:

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

Что это дает?

ответ

12

Вы не можете иметь равные имена в старых списках c-стиля. Если у вас есть C++ 11, вы можете использовать enum class, статические константы в классах, разные пространства имен или просто использовать разные имена.

Пример с enum classes

enum class SocketType 
{ 
    RAW = SOCK_RAW 
}; 

enum class ProtocolType 
{ 
    RAW = IP_PROTO_RAW 
}; 

constants например, с

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

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

Так что я должен переименовать одну из них, несмотря на их, находясь в разных счетчиках? Как глупо это. Глупый язык. Спасибо. –

+1

Нет, вам не нужно переименовывать их. Решение находится в его ответе. – Wilbert

+1

@JesseBrands: Представьте, что язык примет вашу конструкцию, что бы строка 'int x = RAW;' точно? – PlasmaHH

2

Forge::RAW неоднозначен, он не знает, если это от какого типа перечисления.

Используйте этот стиль:

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

Вы могли бы подумать, что он может провести различие между Forge :: SocketType :: RAW и Forge :: ProtocolType :: RAW ... но, по-видимому, C++ все еще находится в каменном веке. –

+0

На самом деле это не так, вы просто решили не использовать классы enum. – Wilbert

+0

Использование C++ 11 не является вариантом для этого проекта. Но ответ Петра, спасибо! –

Смежные вопросы