2013-05-27 16 views
8

Sto riscontrando un problema con gli enumeratori. Non sprechiamo il tempo di nessuno e andiamo dritti a questo. L'errore:Ridefinizione ed Enumeratore

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' 

Il codice:

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

Che cosa dà?

risposta

12

Non è possibile avere nomi uguali nelle vecchie enumerazioni in stile C. Se si dispone di C++ 11, è possibile utilizzare enum class, costanti statiche nelle classi, diversi spazi dei nomi o semplicemente utilizzare nomi diversi.

Esempio con enum classes

enum class SocketType 
{ 
    RAW = SOCK_RAW 
}; 

enum class ProtocolType 
{ 
    RAW = IP_PROTO_RAW 
}; 

esempio con constants

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

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

Quindi devo cambiare titolo uno di loro, nonostante loro essendo in diversi enumeratori? Quanto è stupido. Linguaggio stupido. Grazie. –

+1

No, non è necessario rinominarli. La soluzione è nella sua risposta. – Wilbert

+1

@JesseBrands: Immagina che il linguaggio accetti il ​​tuo costrutto, quale sarebbe la riga 'int x = RAW;' fare esattamente? – PlasmaHH

2

Forge::RAW è ambiguo, non si sa se questo è da quale tipo enum.

usare questo stile:

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

Si potrebbe pensare di fare una distinzione tra Forge :: SocketType :: RAW e Forge :: ProtocolType :: RAW ... ma a quanto pare C++ è ancora nell'età della pietra. –

+0

In realtà, non è così, hai scelto di non usare le classi enum. – Wilbert

+0

L'uso di C++ 11 non è un'opzione per questo progetto. Ma la risposta di Piotr lo farà, grazie! –

Problemi correlati