C++重载operator<<输出enum class时报Invalid operands错误如何解决
问题原因
- 你使用的是C++11引入的强类型枚举(enum class),它不支持隐式转换到底层类型,标准库的
std::ostream没有针对Suits自定义类型的<<运算符重载,所以直接输出s.suit时会触发编译报错。 - 你代码里的
Card类析构函数只声明了没有定义,后续编译完成后的链接阶段也会报错,需要补充实现。
解决方案
有两种常用修复方式:
方式1:输出时强转到底层类型
直接在operator<<实现里把枚举值强制转换为声明时指定的底层类型即可,Suits底层是char,Faces底层是int:
friend std::ostream &operator<<(std::ostream& output, const Card &s){ // 强转Suits为char输出花色字符 output << static_cast<char>(s.suit); // 如果需要输出面值可以加这句 // output << static_cast<int>(s.face); return output; } // 析构函数补充空实现,或者直接写 ~Card() = default; ~Card(){}
方式2:单独给枚举类型重载<<运算符
如果后续多处需要输出枚举值,直接给Suits和Faces单独重载<<运算符,复用性更高:
// 在Suits定义后添加 std::ostream& operator<<(std::ostream& os, const Suits& s) { os << static_cast<char>(s); return os; } // 在Faces定义后添加 std::ostream& operator<<(std::ostream& os, const Faces& f) { os << static_cast<int>(f); return os; }
重载完之后你原来的Card的operator<<不需要修改就可以正常运行,记得还是要补充Card析构函数的实现。
内容的提问来源于stack exchange,提问作者NioOunt
相关产品推荐
相关产品推荐

