You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 08:48:02