繁体   English   中英

输出运算符和后递增运算符重载时,'operator <<'错误不匹配

[英]no match for ‘operator<<’ error when overloading output operator and post increment operator

当我尝试编译以下代码时,编译器会生成一长段错误消息,并显示类似“ std :: cout << aA :: operator ++(0)'中'operator <<'的不匹配”之类的内容。 “候选人是...”

但是,如果将operator <<的第二个参数的类型更改为“ const A&”或简单地为“ A”,它就会神奇地进行编译。

为什么此更改有效? 当<< <<重载时,c ++标准是否将第二个参数的类型强制为const T&或T? 还是有其他原因?

#include <iostream>
using namespace std;

class A
{
public:
    A operator++(int) { return A(); }
};

ostream& operator<<(ostream& os,  A& a)
{
    return os;
}

int main()
{
    A a;
    cout << a++;
    return 0;
}

您缺少的是operator++返回一个临时值。 它必须增加值,但仍返回原始值,因此它要做的是保存原始值的副本,然后递增值,然后返回原始值副本。

此副本作为未命名的临时返回,并且该语言指出不能将此类值绑定到非const引用(作为您的参数)。 无论如何,您都不想传递给输出函数作为非常量引用,就好像您在输出过程中更改了值会使用户感到非常失望。

您不能使用r值初始化非常量引用。 您的operator++返回一个r值。 有两种方法:

将您<<操作符定义为

ostream& operator<<(ostream& os, const A& a)

或传递l值

A b = a++;
cout << b;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM