Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 自定义类到枚举类的隐式转换_C++_Enums_Casting_Enum Class - Fatal编程技术网

C++ 自定义类到枚举类的隐式转换

C++ 自定义类到枚举类的隐式转换,c++,enums,casting,enum-class,C++,Enums,Casting,Enum Class,我想创建一个类,该类将隐式转换为选定的枚举类,以便切换它。但下面的代码不编译(gcc)。编译器抱怨转换不明确,但它也不使用单个转换运算符(任意一个)进行编译。如何实施这种行为 enum class G : int { A, B = 0x100, }; enum class B : int { B1 = 0x100, B2 }; struct Foo { int s; operator G() { return static_c

我想创建一个类,该类将隐式转换为选定的枚举类,以便切换它。但下面的代码不编译(gcc)。编译器抱怨转换不明确,但它也不使用单个转换运算符(任意一个)进行编译。如何实施这种行为

enum class G : int {
    A,
    B = 0x100,
};

enum class B : int {
    B1 = 0x100,
    B2
};

struct Foo {
    int s;

    operator G() {
        return static_cast<G>(s & ~0xff);
    }

    operator B() {
        return static_cast<B>(s);
    }
};

void foo() {
    Foo s;
    s.s = static_cast<int>(B::B1);

    switch (s) {
        case G::A:
            break;
        default:
            break;
    }

    switch (s) {
        case B::B1:
            break;
        default:
            break;
    }
}
enum类G:int{
A.
B=0x100,
};
枚举类B:int{
B1=0x100,
地下二层
};
结构Foo{
int-s;
算子G(){
返回静态\u强制转换(s&~0xff);
}
操作员B(){
返回静态_-cast(s);
}
};
void foo(){
福斯;
s、 s=静态(B::B1);
开关{
案例G::A:
打破
违约:
打破
}
开关{
案例B::B1:
打破
违约:
打破
}
}

由于您有两个转换运算符,因此在开关表达式中使用哪一个运算符非常不明确。您可以使用函数样式转换将其显式转换为所选的
enum
类型:


但编译器知道只有一个运算符与一个开关匹配,因为删除其中一个运算符会删除一个编译器错误。@omicrons,当然它“可以”检测到这一点。但是,这将是一种非标准行为。在您的情况下,C++需要将可转换的表达式转换为枚举类型,问题是,如果您有两种可能的枚举类型,编译器应该采用哪种枚举类型?
switch (G(s)) {
    case G::A:
        break;
    default:
        break;
}

switch (B(s)) {
    case B::B1:
        break;
    default:
        break;
}