c++ E0349没有运算符“〈〈”与这些操作数匹配[重复]

yeotifhr  于 2022-11-19  发布在  其他
关注(0)|答案(1)|浏览(429)

此问题在此处已有答案

How come a non-const reference cannot bind to a temporary object?(11个答案)
Error: cannot bind non-const lvalue reference of type ‘int&’ to an rvalue of type ‘int’(2个答案)
cannot bind non-const lvalue reference of type to an rvalue of type(1个答案)
5天前关闭。
我尝试重载运算符〈〈和++(post和pre)。这是我的代码的一部分,但是我得到错误“e0349:没有与这些操作数”“匹配的运算符。您能告诉我哪里出错了吗?(C++,VS2022)

#include <iostream>
#include <string>

using namespace std;

class K {
    int x, y;
public:
    K(int a, int b) :x(a), y(b) {};
    K() :x(0), y(0) {};
    K operator++(int);
    K& operator++();
    friend ostream& operator<< (ostream & str, K & obj);
    
};

K K::operator++(int) {
    K temp(*this);
    x += 1;
    y += 1;
    return temp;
}
K& K::operator++() {
    x += 1;
    y += 1;
    return *this;
}
ostream& operator<<(ostream& str, K& obj) {
    str << "[" << obj.x << ", " << obj.y << "]";
    return str;
}

int main(int argc, char* argv[])
{
    K obj{10, 20};
    cout << obj++ << endl;  //here I get error
    cout << obj << endl;
    cout << ++obj << endl;

}
5cnsuln7

5cnsuln71#

简单地写后置运算符++,这样它返回一个copy of the temporary value,它可以被用作rvalue,但是插入运算符的签名需要一个reference of the value,它不知道如何检索作为副本传递的数据。这就是你应该如何修改提取运算符的重载函数:

ostream& operator<<(ostream& str, K const& obj) {
    str << "[" << obj.x << ", " << obj.y << "]";
    return str;
}

你只是告诉函数传递的值将有一个constant reference,它不会随时间而改变。所以这就好像你正在接受reference of the copy value。我知道这是一个非常棘手的事情,但我应该已经足够清楚你的头脑

相关问题