无法使用类型为'int'的右值初始化类型为'signFlags'的变量。 [英] cannot initialize a variable of type 'designFlags' with an rvalue of type 'int'

查看:0
本文介绍了无法使用类型为'int'的右值初始化类型为'signFlags'的变量。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个枚举标志,以查看某项内容是否为粗体和斜体,但我遇到了编译错误: 错误:无法使用类型为‘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++标准阻止您执行从intenum的隐式强制转换(注意:允许从enumint的隐式转换)。

但是,您可以改为执行静态强制转换:

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) {
    ...

但我宁愿使用只设置了一个位的标志。

这篇关于无法使用类型为&#39;int&#39;的右值初始化类型为&#39;signFlags&#39;的变量。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆