Richard Reily《C++ (Teach Yourself Computing)》第二版枚举类型代码编译报错求助
Richard Reily《C++ (Teach Yourself Computing)》第二版枚举类型代码编译报错求助
嗨,我完全懂你遇到的困扰——这确实是新旧C标准对枚举类型的处理差异导致的问题,老教材的写法在现代C编译器下会因为更严格的类型安全检查触发错误。
问题根源
在你教材使用的旧版C标准(比如C98)里,枚举类型和int之间是允许隐式双向转换的,所以today-1(结果是int)可以直接赋值给days类型的变量。但从C++11开始,标准收紧了类型安全规则,编译器会默认阻止这种隐式转换,避免意外的类型错误,这就是你看到invalid conversion from 'int' to 'days'报错的原因。
另外顺便提个小笔误:你代码里把Sunday写成了Sundat,虽然这不是当前编译报错的原因,但后续如果要使用Sunday这个枚举值会出问题,记得修正~
解决方案
有两种常见的处理方式,推荐第一种符合现代C++规范的做法:
1. 使用显式类型转换(推荐)
把int结果显式转换回days枚举类型,用C++推荐的static_cast进行安全转换,修改main里的赋值代码即可:
#include <iostream> //declare a new enumerated type 'days' enum days{ Saturday, //Saturday=0 by default Sunday=0, // 修正笔误:Sundat → Sunday Monday, //Monday=1, Sunday+1 Tuesday, //Tuesday=2, Sunday+2 Wednesday,//=3 Thursday, //etc. Friday } today; //declare a new variable 'today' of type 'days' int main(){ //declare two more 'days' objects days yesterday; days tomorrow; //assign some values and print today=Tuesday; // 显式转换int结果为days类型 yesterday=static_cast<days>(today-1); tomorrow=static_cast<days>(today+1); std::cout<<"Today is "<<today; std::cout<<"\nTomorrow is "<<tomorrow; std::cout<<"\nYesterday is "<<yesterday; return 0; }
2. 用旧C++标准编译(不推荐)
如果你只是想验证教材代码的原始行为,可以给编译器加上旧标准的编译选项,比如用GCC的话,添加-std=c++98参数,让编译器以C98标准编译,这样就会允许枚举和int的隐式转换。但这种方式不符合现代C的类型安全理念,不建议在实际项目中使用。
为什么旧教材的代码能运行?
因为你教材编写时采用的是C98标准,当时的规范允许枚举类型与int之间的隐式双向转换,而现在的编译器默认使用C11或更高版本的标准,默认启用了更严格的类型检查,所以会拦截这种不安全的隐式转换。
内容来源于stack exchange
相关产品推荐
相关产品推荐

