cannot initialize a variable of type #39;designFlags#39; with an rvalue of type #39;int#39;(无法使用类型为#39;int#39;的右值初始化类型为#39;signFlags#39;的变量。)
问题描述
我正在尝试创建一个枚举标志,以查看某项内容是否为粗体和斜体,但我遇到了编译错误: 错误:无法使用类型为‘int’的r值初始化类型为‘DesignFlags’的变量 Design标志myDesign=粗体|下划线;#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;
}
推荐答案
C++标准阻止您执行从int到enum的隐式强制转换(注意:允许从enum到int的隐式转换)。
但是,您可以改为执行静态强制转换:
designFlags myDesign = static_cast<designFlags>(BOLD | UNDERLINE);
cout << myDesign; // prints 5
请记住,结果值很可能不是designFlags中指定的值之一。这通常是一种常见的做法,但您必须依赖逐位运算来执行比较:
例如:
// wrong
if (myDesign == BOLD)
// ok (most of the time)
if (myDesign & BOLD)
// always ok
if ((myDesign & BOLD) == BOLD)
更新:为什么myDesign & BOLD大多数时候都是正常的?
使用标志时,值必须是2的幂:1、2、4、8等。因此,每个可能的值只设置一个位,并且每个值的位都不同。
然后,当您执行myDesign & BOLD时,您测试的是一个特定的比特,仅此而已。如果设置了该位,则结果将为非零(按位与)。如果未设置该位,则结果将为零。
什么时候可能出错?如果您使用的标志不是2的幂,则每个单独的值都将设置一个以上的位,从而使执行这些检查变得困难。
例如,假设您有这样的定义:
enum designFlags {
BOLD = 2,
ITALICS = 4,
UNDERLINE = 6
};
然后将设计设置为UNDERLINE:
myDesign = UNDERLINE
下列测试的结果是什么?
myDesign & BOLD
myDesign & ITALICS
这两个参数都将为非零,这肯定是不受欢迎的行为。
您当然可以执行以下操作:
if ((myDesign & BOLD) == BOLD) {
...
但我宁愿使用只设置了一个位的标志。
这篇关于无法使用类型为';int';的右值初始化类型为';signFlags';的变量。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:无法使用类型为';int';的右值初始化类型为';signFlags';的变量。
基础教程推荐
- 为什么派生模板类不能访问基模板类的标识符? 2021-01-01
- 非静态 const 成员,不能使用默认赋值运算符 2022-10-09
- CString 到 char* 2021-01-01
- GDB 显示调用堆栈上函数地址的当前编译二进制文 2022-09-05
- 我应该对 C++ 中的成员变量和函数参数使用相同的名称吗? 2021-01-01
- 为什么 RegOpenKeyEx() 在 Vista 64 位上返回错误代码 2021-01-01
- 通过引用传递 C++ 迭代器有什么问题? 2022-01-01
- 如果我为无符号变量分配负值会发生什么? 2022-01-01
- 初始化列表*参数*评估顺序 2021-01-01
- 为什么 typeid.name() 使用 GCC 返回奇怪的字符以及如 2022-09-16
