C++ ostream<<运算符重载自定义类失效 按引用传参时报错
报错原因
编译报错的核心原因是你重载的输出流运算符第二个参数使用了非常量左值引用 temperature &t。
执行cout << 75.0_stC;时,自定义字面量_stC调用完成后会返回一个临时的temperature对象,临时对象属于右值,C++语法规则不允许非常量左值引用绑定到右值,因此编译器找不到匹配的operator<<重载版本,直接抛出编译错误。这也解释了为什么问题仅在按引用传递时出现:如果参数按值传递,会直接拷贝临时对象完成传参,不存在引用绑定的限制,不会触发该类错误。
修复方法
输出流运算符的作用仅为读取待输出对象的内容、不会修改对象本身,给引用参数加上const修饰即可解决问题:常量左值引用支持绑定到右值,同时和你已经用const修饰的show()成员函数完全适配。
修复后的输出运算符实现如下:
std::ostream& operator<<(std::ostream& ekran, const temperature& t) { ekran << t.show(); return ekran; }
额外提醒:标准库的ostream、cout都定义在std命名空间下,使用时需要正确添加std::前缀,或提前引入对应命名空间;同时代码中需要包含<iostream>头文件,否则会触发标识符未定义的编译错误。
内容的提问来源于stack exchange,提问作者varkus
相关产品推荐
相关产品推荐

