没有操作员"<<&#;使用运算符重载时匹配这些操作数

时间:2018-03-03 18:19:43

标签: c++ overloading ostream

以下尝试运算符重载导致错误:

#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;
}

1 个答案:

答案 0 :(得分:4)

您必须将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.

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