2013-05-27 3 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, 클래스의 정적 상수 또는 다른 네임 스페이스를 사용하거나 단순히 다른 이름을 사용할 수 있습니다. 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::RAWenum classes

enum class SocketType 
{ 
    RAW = SOCK_RAW 
}; 

enum class ProtocolType 
{ 
    RAW = IP_PROTO_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 사용은이 프로젝트의 옵션이 아닙니다. 하지만 Piotr의 대답은 감사 할 것입니다. –