为何重载++和<<运算符后,cout << ++Object;会触发编译错误?
问题分析与解决:重载运算符引发的编译错误
前置代码与问题现象
类与运算符重载代码
#include <iostream> using namespace std; class Test{ public: int num=0; Test operator++(){ num++; return *this; } }; ostream &operator<<(ostream &mystream, Test &x){ mystream << x.num; return mystream; }
正常运行的main函数
int main(){ Test a; ++a; cout << a << endl; return 0; }
触发错误的代码
当把递增和输出合并为一行时:
int main(){ Test a; cout << ++a << endl; return 0; }
编译器抛出错误:
error: invalid operands to binary expression ('std::ostream' (aka 'basic_ostream
') and 'Test')
cout << ++a << endl;
~~~~ ^ ~~~
错误原因
- 你实现的前置
operator++()返回的是Test类型的临时对象(返回值为Test,而非引用),执行++a后会生成一个拷贝出来的临时实例。 - 但重载的
operator<<第二个参数是非const的左值引用(Test &x),C++语法明确禁止将临时对象绑定到非const左值引用上,导致编译器找不到匹配的输出运算符重载,从而报错。
解决方法
有两种可靠的修复方式,推荐同时使用:
方式一:修正前置++的返回类型为左值引用
前置递增的标准语义是返回自身的引用,这样不会产生临时对象,直接返回原对象的左值,既符合逻辑又避免临时对象问题:
Test& operator++(){ num++; return *this; }
方式二:将operator<<的参数改为const引用
流输出操作本身不应该修改对象,把参数改为const Test &x后,临时对象可以合法绑定到const左值引用上,同时保证了const正确性,这也是输出运算符的常规写法:
ostream &operator<<(ostream &mystream, const Test &x){ mystream << x.num; return mystream; }
内容的提问来源于stack exchange,提问作者Giorgos
相关产品推荐
相关产品推荐

