使用运算符重载时,没有运算符"<<"匹配这些操作数

no operator "<<" matches these operands when using operator overloading

本文关键字:lt 运算符 操作数 重载      更新时间:2023-10-16
错误,

尝试运算符重载:

#include<iostream>
#include<string>
#include<ostream>
using namespace std;
class Dollar
{
private:
    float currency, mktrate, offrate;
public:
    Dollar(float);
    float getDollar() const;
    float getMarketSoums() const;
    float getofficialSoums() const;
    void getRates();
    // In the following function I was trying to overload "<<" in order to print all the data members:
    friend void operator<<(Dollar &dol, ostream &out)
    {
        out << dol.getDollar() << endl;
        out << dol.getMarketSoums() << endl;
        out << dol.getofficialSoums() << endl;
    }
};
Dollar::Dollar(float d)
{
    currency = d;
}
float Dollar::getDollar() const
{
    return currency;
}
float Dollar::getMarketSoums() const
{
    return mktrate;
}
float Dollar::getofficialSoums() const
{
    return offrate;
}
void Dollar::getRates()
{
    cin >> mktrate;
    cin >> offrate;
}
int main()
{
    Dollar dollar(100);
    dollar.getRates();
    // In this line I am getting the error. Could you please help to modify it correctly?
    cout << dollar;
    system("pause");
    return 0;
}

您必须std::ostream对象作为第一个参数传递给插入运算符,<<而不是第二个参数,只要您以这种方式调用它:

friend void operator << (ostream &out, Dollar &dol);
    只要
  • 此函数只是打印而不打算修改对象的成员,就应该将传入的对象constant reference

    friend void operator << (ostream &out, const Dollar& dol);
    
  • 因此通过引用以避免多个副本和const避免无意修改。

  • 如果你想调用它
  • 以让你想要的方式工作,你可以这样做:

    friend void operator<<(const Dollar &dol, ostream &out){
        out << dol.getDollar() << endl;
        out << dol.getMarketSoums() << endl;
        out << dol.getofficialSoums() << endl;
    }
    

在主要例如:

    operator << (dollar, cout); // this is ok
    dollar << cout; // or this. also ok.

如您所见,我颠倒了调用插入运算符以匹配上述签名的顺序。但我不建议这样做,这只是为了更多地了解它应该如何工作。