C++递减函数重载,在后置递减的测试代码中出现“没有与操作数匹配的<<运算符”故障,求解


#include<iostream>
using namespace std;

//--运算符的重载,前置重载和后置重载

class MyInteger
{
    friend ostream &operator<<(ostream& cout, MyInteger& p);

public:
    MyInteger()
    {
        m_Num = 10;
    }

    //前置递减的重载
    MyInteger& operator--()
    {
        --m_Num;
        return *this;
    }

    //后置递减的重载
    MyInteger operator--(int)
    {
        MyInteger tmp = *this;
        m_Num--;
        return tmp;
    }

private:
    int m_Num;
};

ostream &operator<<(ostream& cout, MyInteger &myint)
{
    cout << myint.m_Num << endl;
    return cout;
}

void test01()
{
    MyInteger myint;
    cout << --myint<< endl;
    cout << myint<< endl;
}

void test02()
{
    MyInteger myint;
    cout << myint-- << endl;
    cout << myint << endl;
}

int main()
{
    test01();
    test02();

    system("pause");
    return 0;
}

故障截图:

img

img

首先说明一点:最好不要局部变量与全局变量重名,虽然语法上允许,但是最好不要,会导致程序可读性降低,比如你重载运算符,形参名字不应该是cout,换个名字不好吗。
这个问题也是因为你代码不规范导致的,因为myint--返回的是一个右值,而运算符重载参数是一个左值引用,通常不加const的左值引用不能绑定一个右值,因为你可能在函数中修改实参。解决方法就是把第二个参数改成const左值引用。这也是代码习惯问题,在函数中不修改实参一定要用const引用,切记!

operator<<()函数的第二个参数加上const

friend ostream &operator<<(ostream& cout, const MyInteger& p);

ostream &operator<<(ostream& cout, const MyInteger& p);