用或定义枚举为标志

时间:2018-11-13 09:44:32

标签: c++ enums

我正在尝试创建一个枚举作为标志。我来自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));
}

但是我有一个错误:

  

'TypeA'的定义

编辑:

我是C ++的新手,却忘记了编译器。有我的环境:

  • 我正在Windows 10上工作
  • 使用Visual Studio 2017
  • 我使用Clang 3.8为android编译,并且我瞄准KitKat 4.4
  • 我正在使用C ++ 11

编辑2:

我发现了问题所在。在我的命名空间中,我有一个类名typeA:

在.h中:

namespace myNameSpace
{
    namespace myOtherNameSpace
    {
        class typeA {...}
    }
}

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

2 个答案:

答案 0 :(得分:0)

要结束本主题,多亏了Swordfish,找到了答案:

import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( theme: ThemeData(), home: Home() ); } } class Home extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( body: Center( child: RaisedButton( child: Text('Show dialog!'), onPressed: () { showDialog( context: context, builder: (BuildContext context) { return Dialog( child: Text('Dialog.'), ); }); }), ), ); } } 替换为enum

enum class

使用简单的enum class myEnum { TypeA = 0x01, TypeB = 0x02, TypeC = 0x04, TypeAB = TypeA | TypeB }; 可以编写enum,因此,如果将一个类命名为myEnum e = TypeA,则会出现冲突,并且会出现编译错误。

对于TypeA,您必须指定枚举enum class。这样可以避免某些错误,并允许使用名为myEnum e = myEnum::TypeA

的类

答案 1 :(得分:-1)

您的代码没有错-也许是另一个问题。

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

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

更新:该代码可能无法在较旧的编译器(如clang 3.8)上运行-因为它是“现代” c ++功能。