C++:“'operator<<'不匹配(操作数类型为'std::ostream'和'Complex')”

C++: "No match for 'operator<<' (operand types are 'std::ostream' and 'Complex')"

提问人:Tahmid Kawser Washee 提问时间:7/26/2023 最后编辑:machine_1Tahmid Kawser Washee 更新时间:7/26/2023 访问量:55

问:

我正在尝试使用 C++ 中的自定义 Max 函数比较和打印两个复杂对象。Complex 类重载了运算符>>和运算符<<,我还定义了一个布尔运算符>以根据它们的大小来比较两个 Complex 对象。但是,当我尝试使用 Max<Complex> 函数查找两个 Complex 对象的最大值并打印结果时,我遇到了错误:

“'operator<<'不匹配(操作数类型为'std::ostream'和'Complex')”。

#include<bits/stdc++.h>

using namespace std;

class Complex
{
    int real;
    int img;
public:
    bool operator>(Complex &a)
    {
        if(this->real*this->real + this->img*this->img > a.real*a.real + a.img*a.img)
            return 1;
        return 0;
    }
    friend istream& operator>>(istream &in, Complex &e);
    friend ostream& operator<<(ostream &out, Complex &e);
};
istream& operator>>(istream &in, Complex &e)
{
    in >> e.real;
    in >> e.img;
    return in;
}
ostream& operator<<(ostream &out, Complex &e)
{
    out << e.real << "+ i" << e.img;
    return out;
}

template<class T> T Max(T a,T b)
{
    return (a>b)? a: b;
}

int main()
{
    Complex a,b;
    cin >> a >> b;
    cout << Max<Complex>(a,b);
}

我找不到这个错误背后的原因。

C++ OOP 模板 运算符重载 传递引用

评论


答:

4赞 Vlad from Moscow 7/26/2023 #1

问题是该函数返回一个临时对象Max

template<class T> T Max(T a,T b)
{
    return (a>b)? a: b;
}

但是,根据其声明,期望左值引用operator <<

friend ostream& operator<<(ostream &out, Complex &e);
                                         ^^^^^^^^^^

不能将临时对象绑定到非常量左值引用。

声明运算符,如

friend ostream& operator<<(ostream &out, const Complex &e);

//...

ostream& operator<<(ostream &out, const Complex &e)
{
    out << e.real << "+ i" << e.img;
    return out;
}

即为第二个参数的引用类型指定限定符。const