C++ 无法初始化类型为';设计标志';具有类型为';int';
我正在尝试创建一个枚举标志,以查看某个内容是否为粗体和斜体,但我遇到了编译错误: 错误:无法使用“int”类型的右值初始化“designFlags”类型的变量 designFlags myDesign=粗体|下划线C++ 无法初始化类型为';设计标志';具有类型为';int';,c++,enums,bitwise-operators,flags,C++,Enums,Bitwise Operators,Flags,我正在尝试创建一个枚举标志,以查看某个内容是否为粗体和斜体,但我遇到了编译错误: 错误:无法使用“int”类型的右值初始化“designFlags”类型的变量 designFlags myDesign=粗体|下划线 #include <iostream> using namespace std; enum designFlags { BOLD = 1, ITALICS = 2, UNDERLINE = 4 }; int main() { desi
#include <iostream>
using namespace std;
enum designFlags {
BOLD = 1,
ITALICS = 2,
UNDERLINE = 4
};
int main()
{
designFlags myDesign = BOLD | UNDERLINE;
// 00000001
// | 00000100
// ___________
// 00000101
cout << myDesign;
return 0;
}
#包括
使用名称空间std;
枚举设计标志{
粗体=1,
斜体=2,
下划线=4
};
int main()
{
designFlags myDesign=粗体|下划线;
// 00000001
// | 00000100
// ___________
// 00000101
CUT< P> C++标准阻止您执行从<代码> int <代码>到<代码> EnUM <代码>的隐式转换(注:允许从代码< EnUM < /C> >到<代码> int >代码>的隐式转换。
但是,您可以改为执行静态强制转换:
designFlags myDesign = static_cast<designFlags>(BOLD | UNDERLINE);
cout << myDesign; // prints 5
更新:为什么myDesign&BOLD
大多数时候都可以?
使用标志时,值必须是2的幂:1、2、4、8等。因此,每个可能的值只设置了一个位,并且每个位都不同
然后,当您执行myDesign&BOLD
时,您正在测试一个特定的位,仅此而已。如果该位已设置,结果将为非零(按位和)。如果未设置该位,结果将为零
什么时候会出错?如果使用的标志不是2的幂,那么每个值都将设置多个位,这使得执行这些检查变得很困难
例如,假设您有以下定义:
enum designFlags {
BOLD = 2,
ITALICS = 4,
UNDERLINE = 6
};
然后将设计设置为下划线
:
myDesign = UNDERLINE
以下测试的结果是什么
myDesign & BOLD
myDesign & ITALICS
这对他们两人来说都将是非零的,肯定是一种不受欢迎的行为
当然,您可以执行以下操作:
if ((myDesign & BOLD) == BOLD) {
...
但是我宁愿只使用一个位设置的标志。什么编译错误?请复制并粘贴到这里。BOLD |下划线
不一定是有效的designFlags
值。为什么不将myDesign
改为int
呢?designFlags
是标志的组合,所以应该声明为int.@alterigel的可能副本对于非作用域枚举,有效值是可表示枚举数的值的范围。枚举数需要3位来表示,因此任何3位值都是有效的-无论它们是否显式命名为枚举值。BOLD | UNDERLINE
绝对有效。为什么myDesignGrand 大多数时候都是正确的?当它出错的时候会是什么情况?”安德烈我用一些评论更新了我的答案,希望它有帮助!啊,没有考虑多位标志,谢谢!
if ((myDesign & BOLD) == BOLD) {
...