Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.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++ std::cin提取到枚举_C++_Enums_Stream - Fatal编程技术网

C++ std::cin提取到枚举

C++ std::cin提取到枚举,c++,enums,stream,C++,Enums,Stream,我不明白为什么我不能这么说: enum MyEnum {X=1, Y}; ... X x; std::cin >> x; 问题是C++不聪明,我错了什么? 可以,但是你需要编写一个自定义的代码>运算符> 过载: std::istream& operator>>(std;:istream& is, MyEnum& e) { ... } 无法使用默认的std::istream运算符>>重载执行此操作的原因是,右侧参数必须与运算符重载的参数完全匹配,

我不明白为什么我不能这么说:

enum MyEnum {X=1, Y};
...
X x;
std::cin >> x;

问题是C++不聪明,我错了什么?

可以,但是你需要编写一个自定义的代码>运算符> <代码>过载:

std::istream& operator>>(std;:istream& is, MyEnum& e) { ... }
无法使用默认的
std::istream
运算符>>
重载执行此操作的原因是,右侧参数必须与运算符重载的参数完全匹配,因为它是由非常量引用获取的(因为运算符将通过赋值来修改对象)

另一个选项是将流中的整数表示形式提取为
int
,然后将其转换为枚举类型:

int i;
MyEnum e;

if (!(std::cin >> i)) { /* handle error */ }
e = static_cast<MyEnum>(i);
inti;
髓鞘e;
如果(!(std::cin>>i)){/*句柄错误*/}
e=静态压力(i);

您可能希望在这里执行一些错误检查,除非您确定提取的值能够用
MyEnum
表示。(从技术上讲,您还应该小心提取到
int
,因为
int
可能无法表示
MyEnum
的所有值。在对另一个问题的回答中,有一个关于如何执行此操作的解释,)

MyEnum
是用户定义的类型。您认为语言(编译器)必须有多聪明才能“猜测”您想要输出任何给定的用户定义类型的格式?@André:没有那么多。枚举由整数表示。顺便说一下,我想输入,而不是输出。
classx{intx;}
也用整数表示。它不会改变它是用户定义类型(UDT)的事实。这也是编译器不隐式转换为枚举类型的原因。James答案中的“输入整数+强制转换为枚举”是一种规避此问题的方法。