【问题标题】:Redefinition and Enumerator重新定义和枚举器
【发布时间】:2013-05-27 11:32:02
【问题描述】:

我遇到了枚举数问题。让我们不要浪费任何人的时间,直接开始吧。错误:

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

什么给了?

【问题讨论】:

    标签: c++ visual-c++ enums


    【解决方案1】:

    在旧的 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;
    };
    

    【讨论】:

    • 所以我必须重命名其中一个,尽管它们在不同的枚举器中?这是多么愚蠢。愚蠢的语言。谢谢。
    • 不,您不必重命名它们。解决方案就在他的回答中。
    • @JesseBrands:想象一下语言会接受你的结构,int x = RAW; 行会做什么?
    • 我想我完全理解他的来历。我希望int x = RAW; 行是无效的语法。我个人希望它阅读int x = SocketType::RAW;int x = Forge::SocketType::RAW;
    【解决方案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
          };
        }
    }
    

    【讨论】:

    • 您可能认为它可以区分 Forge::SocketType::RAW 和 Forge::ProtocolType::RAW...但显然 C++ 仍处于石器时代。
    • 其实不是,你只是选择不使用枚举类。
    • 使用 C++11 不是这个项目的选项。但是 Piotr 的回答可以,谢谢!
    • @JesseBrands 那么谁在石器时代? C++ 已经进入青铜时代整整两年了:-)
    • @JesseBrands 真的,同时说“语言太老了”和“我们不使用语言的新形式”……很有趣。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    相关资源
    最近更新 更多