C++ 自定义类到枚举类的隐式转换
我想创建一个类,该类将隐式转换为选定的枚举类,以便切换它。但下面的代码不编译(gcc)。编译器抱怨转换不明确,但它也不使用单个转换运算符(任意一个)进行编译。如何实施这种行为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
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;
}