在重载的后缀递增/递减运算符上重载ostream运算符

ostream operator overloading on an overloaded postfix increment/decrement operator

本文关键字:运算符 重载 ostream 后缀      更新时间:2023-10-16

我展示了下面的代码。当我重载重载的后缀运算符时,编译器会抛出错误。它在重载前缀运算符上运行良好。错误

error: no match for ‘operator<<’ in ‘std::cout << cDigit.Digit::operator++(0)’

代码

#include <iostream>
using namespace std;
class Digit
{
private:
    int m_nDigit;
public:
    Digit(int nDigit=0)
    {
        m_nDigit = nDigit;
    }
    Digit& operator++(); // prefix
    Digit& operator--(); // prefix
    Digit operator++(int); // postfix
    Digit operator--(int); // postfix
    friend ostream& operator<< (ostream &out, Digit &digit);
    int GetDigit() const { return m_nDigit; }
};
Digit& Digit::operator++()
{
    // If our number is already at 9, wrap around to 0
    if (m_nDigit == 9)
        m_nDigit = 0;
    // otherwise just increment to next number
    else
        ++m_nDigit;
    return *this;
}
Digit& Digit::operator--()
{
    // If our number is already at 0, wrap around to 9
    if (m_nDigit == 0)
        m_nDigit = 9;
    // otherwise just decrement to next number
    else
        --m_nDigit;
    return *this;
}
Digit Digit::operator++(int)
{
    // Create a temporary variable with our current digit
    Digit cResult(m_nDigit);
    // Use prefix operator to increment this digit
    ++(*this);             // apply operator
    // return temporary result
    return cResult;       // return saved state
}
Digit Digit::operator--(int)
{
    // Create a temporary variable with our current digit
    Digit cResult(m_nDigit);
    // Use prefix operator to increment this digit
    --(*this);             // apply operator
    // return temporary result
    return cResult;       // return saved state
}
ostream& operator<< (ostream &out, Digit &digit)
{
  out << digit.m_nDigit;
  return out;
}
int main()
{
    Digit cDigit(5);
    cout << ++cDigit << endl; // calls Digit::operator++();
    cout << --cDigit << endl; // calls Digit::operator--();
    cout << cDigit++ << endl; // calls Digit::operator++(int); //<- Error here??
 return 0;
}

您的operator<<应该通过常量引用获取其Digit参数:

ostream& operator<< (ostream &out, const Digit &digit)

这里需要这样做,因为Digit::operator++(int)返回一个临时对象,该对象不能传递给采用非常数引用的函数。