首页 > 解决方案 > ++ 前缀运算符重载不适用于 <<

问题描述

这里有点新的 C++ 开发人员。我有一个类Rational用于表示有理数并允许用户对它们执行算术和关系运算。我重载了所有运算符,它们都正常工作,除非我尝试将++/--前缀运算符(例如,--Rational)或+/-一元运算符与<<输出运算符组合在一起,如:

Rational num(7, 2); // initializes rational to 7/2 (fraction)
cout << --num; // should change val to 5/2 (decrements by one)
// error: no match for 'operator<<'(operand types are 'std::ostream' {aka 'std::basic_ostream<char>'} and 'Rational')

或者:

Rational num(1, 10);
cout << -num; // should change to -1/10
// error: no match for 'operator<<'(operand types are 'std::ostream' {aka 'std::basic_ostream<char>'} and 'Rational')

我不明白为什么,因为我已经重载了所有这些运算符以返回一个Rational对象,并且我也重载了<<运算符以接受一个Rational对象。有趣的是,当我尝试这个时:

Rational num(5, 3);
cout << num;

它按预期工作。那么有人可以告诉我这里发生了什么吗?

类的相关代码:

class Rational
{
private:
    // Instance variables declarations
    int numerator, denominator;
public:
    // Constructors declarations
    Rational(int numer_val, int denom_val = 1);
    Rational();

    // Unary operators declarations
    friend Rational operator +(const Rational &num);
    friend Rational operator -(const Rational &num);
    friend Rational operator ++(Rational &num);
    friend Rational operator --(Rational &num);
    // I/O operators
    friend ostream& operator <<(ostream &outs, Rational &num);
};

// Constructors definitions

Rational::Rational(int numer_val, int denom_val) : numerator(numer_val)
{
   set_denominator(denom_val); // irrelevant
   simplify(); // irrelevant
}
Rational::Rational() : Rational(0) { }

// Unary operators definitions
Rational operator +(const Rational &num)
{
    return Rational(+num.numerator, num.denominator);
}
Rational operator -(const Rational &num)
{
    return Rational(-num.numerator, num.denominator);
}
Rational operator ++(Rational &num)
{
    num.numerator += num.denominator;
    return num;
}
Rational operator --(Rational &num)
{
    num.numerator -= num.denominator;
    return num;
}
// I/O operators
ostream& operator <<(ostream &outs, Rational &num)
{
    outs << to_string(num.numerator) + "/" + to_string(num.denominator);
    return outs;
}

标签: c++operator-overloadingoverloading

解决方案


您的第二个参数operator<<绑定到左值引用:

ostream& operator <<(ostream &outs, Rational & num)
                                          // ^

但是您所有的运算符都返回 r 值。例如,当你这样做时:

cout << -num;

您正在尝试将左值引用绑定到右值,这是不允许的。

您可以通过更改operator<<为接受 const 引用来解决此问题:

ostream& operator <<(ostream &outs, Rational const & num)
                                          // ^^^^^^^

推荐阅读