我正在尝试创建一个枚举作为标志。我来自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 ++的新手,却忘记了编译器。有我的环境:
编辑2:
我发现了问题所在。在我的命名空间中,我有一个类名typeA:
在.h中:
namespace myNameSpace
{
namespace myOtherNameSpace
{
class typeA {...}
}
}
两者之间存在冲突。我可以修改我的枚举以保留myEnum.TypeA
还是应该重命名此成员?
答案 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 ++功能。