C++ 使用or将枚举定义为标志

C++ 使用or将枚举定义为标志,c++,enums,C++,Enums,我正在尝试创建一个枚举作为标志。我来自C,我想在C++中创建一个等价物。我发现如何在C++中创建一个枚举作为标志,而不是如何为另一个成员值重用成员。 我不知道如何清楚地问我的问题,所以下面是我试图用C代码做的: [Flags] enum myEnum { TypeA = 0x01, TypeB = 0x02, TypeC = 0x04, TypeAB = TypeA | TypeB } 我用C++写的东西: enum myEnum { TypeA = 0

我正在尝试创建一个枚举作为标志。我来自C,我想在C++中创建一个等价物。我发现如何在C++中创建一个枚举作为标志,而不是如何为另一个成员值重用成员。 我不知道如何清楚地问我的问题,所以下面是我试图用C代码做的:

[Flags]
enum myEnum
{
    TypeA = 0x01,
    TypeB = 0x02,
    TypeC = 0x04,
    TypeAB = TypeA | TypeB
}
我用C++写的东西:

enum myEnum
{
    TypeA = 0x01,
    TypeB = 0x02,
    TypeC = 0x04,
    TypeAB = TypeA | TypeB
};
inline myEnum operator|(myEnum a, myEnum b)
{
    return static_cast<myEnum>(static_cast<int>(a) | static_cast<int>(b));
}

两者之间存在冲突。我可以修改我的枚举以保留myEnum.TypeA吗?或者我应该重命名此成员吗?

您的代码没有问题,因此可能是另一个问题

但是,您可以只指定基础枚举,而不是强制转换等,这样您的枚举就成为

enum myEnum : int
{
    TypeA = 0x01,
    TypeB = 0x02,
    TypeC = 0x04,
    TypeAB = TypeA | TypeB
};

更新:该代码可能在旧的编译器上工作,比如CLAN 3.8——因为它是一个“现代”C++特性。

关闭这个主题,得到了答案,感谢剑鱼:

用枚举类替换枚举

使用simple enum,您可以编写myEnum e=TypeA,因此,如果一个类名为TypeA,则会发生冲突,并且会出现编译错误


对于enum类,必须指定enum myEnum e=myEnum::TypeA。这可以避免一些错误,并允许有一个名为TypeA的类

您不需要为您的枚举实现custom运算符|,因为它不是强类型作用域枚举。是的,请提供一个。您的代码可以为我生成@Swordfish-如果要将结果分配回myEnum而不使用强制转换,您可以这样做。@Swordfish-枚举的定义中不使用它。枚举数只是基础类型中特定值的名称。因此,当TypeAB=TypeA | TypeB被定义时|是内置的整数或运算符,而myEnum e=TypeA | TypeB;实际上会使用重载运算符,或者在运算符不存在时导致错误。相同的标记在不同的上下文中表示不同的事物。喜欢C++,嗯?如果不希望枚举数填充周围的命名空间,使用枚举类,如果没有操作符,它将是无用的。
enum myEnum : int
{
    TypeA = 0x01,
    TypeB = 0x02,
    TypeC = 0x04,
    TypeAB = TypeA | TypeB
};
enum class myEnum
{
    TypeA = 0x01,
    TypeB = 0x02,
    TypeC = 0x04,
    TypeAB = TypeA | TypeB
};