kyq_linux 发表于 2020-10-8 23:26:09

【求助帖】C++关于后置++重载 出现报错

额 想学下C++ 然后看到那个++运算符重载的时候发现前置++重载能data:text/plain;base64,I2luY2x1ZGUgPGlvc3RyZWFtPg0KdXNpbmcgbmFtZXNwYWNlIHN0ZDsNCmNsYXNzIG15b3BlcmF0b3INCnsNCglmcmllbmQgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBjb3V0LCBteW9wZXJhdG9yJiBwMSk7DQpwdWJsaWM6DQoJaW50IG1fYTsNCglteW9wZXJhdG9yKGludCBhKSA6bV9hKGEpIHt9Ow0KCW15b3BlcmF0b3ImIG9wZXJhdG9yKysoKTsNCglteW9wZXJhdG9yIG9wZXJhdG9yKysoaW50KTsNCn07DQpvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mIGNvdXQsIG15b3BlcmF0b3ImIHAxKQ0Kew0KCWNvdXQgPDwgIm1fYSA9ICIgPDwgcDEubV9hOw0KCXJldHVybiBjb3V0Ow0KfQ0KbXlvcGVyYXRvciYgbXlvcGVyYXRvcjo6b3BlcmF0b3IrKygpDQp7DQoJdGhpcy0+bV9hKys7DQoJcmV0dXJuICp0aGlzOw0KfQ0KbXlvcGVyYXRvciBteW9wZXJhdG9yOjpvcGVyYXRvcisrKGludCkNCnsNCglteW9wZXJhdG9yIHRtcCA9ICp0aGlzOw0KCSsrdGhpcy0+bV9hOw0KCXJldHVybiB0bXA7DQp9DQp2b2lkIHRlc3QwMSgpDQp7DQoJbXlvcGVyYXRvciBwMSgxKTsNCgljb3V0IDw8ICsrcDEgPDwgZW5kbDsNCgljb3V0IDw8IHAxKysgPDwgZW5kbDsgICAvL+i/meWPpeivnemUmeivryAgLy/plJnor69FMDM0OQnmsqHmnInkuI7ov5nkupvmk43kvZzmlbDljLnphY3nmoQgIjw8IiDov5DnrpfnrKYNCn0NCmludCBtYWluKHZvaWQpDQp7DQoJdGVzdDAxKCk7DQoJc3lzdGVtKCJwYXVzZSIpOw0KCXJldHVybiBFWElUX1NVQ0NFU1M7DQp9实现cout 出来 后置++ cout << 的时候呢 就直接报错了 关键是不知道怎么解决源代码如下 求坛内大佬给个解释。。。
#include <iostream>
using namespace std;
class myoperator
{
        friend ostream& operator<<(ostream& cout, myoperator& p1);
public:
        int m_a;
        myoperator(int a) :m_a(a) {};
        myoperator& operator++();
        myoperator operator++(int);
};
ostream& operator<<(ostream& cout, myoperator& p1)
{
        cout << "m_a = " << p1.m_a;
        return cout;
}
myoperator& myoperator::operator++()
{
        this->m_a++;
        return *this;
}
myoperator myoperator::operator++(int)
{
        myoperator tmp = *this;
        ++this->m_a;
        return tmp;
}
void test01()
{
        myoperator p1(1);
        cout << ++p1 << endl;
        cout << p1++ << endl;   //这句话错误//错误E0349        没有与这些操作数匹配的 "<<" 运算符
}
int main(void)
{
        test01();
        system("pause");
        return EXIT_SUCCESS;
}



kyq_linux 发表于 2020-10-8 23:28:11

        p1++;
        cout << p1 << endl;
这样输出是可以的 但是cout << p1++ << endl; 这样就报错了 是不是我<< 重载 错了。。。但是我那个 cout << ++p1 << endl; 又没有问题。。。好奇怪 。。。
有点菜。。

wye11083 发表于 2020-10-8 23:41:30

你放这里面估计没几个人能回答了。通常大家会把变量增减单独放外面---cout之类仅作为调试打印接口。

kyq_linux 发表于 2020-10-8 23:51:24

wye11083 发表于 2020-10-8 23:41
你放这里面估计没几个人能回答了。通常大家会把变量增减单独放外面---cout之类仅作为调试打印接口。 ...

++p1; p1++ 都可以在这段代码实现重载的把。。但是cout 的时候 p1++返回就出错了 。但是我看到的示例代码也是这么做的。。。就不知道怎么整了。。

wye11083 发表于 2020-10-8 23:55:25

kyq_linux 发表于 2020-10-8 23:51
++p1; p1++ 都可以在这段代码实现重载的把。。但是cout 的时候 p1++返回就出错了 。但是我看到的示例代码 ...

那就甭纠结了,因为一般没人这么用。。只有那些自以为很牛x的,其实在某个方面确实很吊的人才会去炫某项特长,比如我看过一个exe用的纯winapi,里面没有任何物理上的函数调用,只有一个个的函数碎片,然后各种message满天飞。事实上,注重可重用性,以及代码可读性的人是不可能写这种代码的。

kyq_linux 发表于 2020-10-9 00:01:58

wye11083 发表于 2020-10-8 23:55
那就甭纠结了,因为一般没人这么用。。只有那些自以为很牛x的,其实在某个方面确实很吊的人才会去炫某项 ...

好的吧,之前一直都是用C想玩下C++就自己网上找资料看一看语法,自己写一写demo 试试自己能不能玩。。哈哈

uindex 发表于 2020-10-9 00:30:50

ostream& operator<<(ostream& cout, myoperator& p1)
只接受引用,需要实例已构造。
ostream& operator<<(ostream& cout, myoperator p1)
改成这样实例和引用都可以。至于内部原理,大概是语言的性能优化考虑。

kyq_linux 发表于 2020-10-9 01:04:40

uindex 发表于 2020-10-9 00:30
ostream& operator

。。。。好像可以用了。。。。

canspider 发表于 2020-10-9 09:47:55

本帖最后由 canspider 于 2020-10-9 09:50 编辑

你的第二个operator++返回了一个临时变量,这个在C++里面是一个右值(简单来说就是只能放在=号右边)
而你重载的<<操作符号第二个参数是一个非const的引用,非const的引用需要一个左值(可以放在=号左边,可以赋值)来初始化,因此报错
解决办法很简单,把你重载的<<符号第二个参数加上const修饰即可。加了const修饰的引用可以用右值来初始化

uindex 发表于 2020-10-9 14:59:43

canspider 发表于 2020-10-9 09:47
你的第二个operator++返回了一个临时变量,这个在C++里面是一个右值(简单来说就是只能放在=号右边)
而你 ...

仰望加膜拜大牛权威解释~谢谢分享知识!

kyq_linux 发表于 2020-10-9 20:02:41

本帖最后由 kyq_linux 于 2020-10-9 21:38 编辑

canspider 发表于 2020-10-9 09:47
你的第二个operator++返回了一个临时变量,这个在C++里面是一个右值(简单来说就是只能放在=号右边)
而你 ...

好像不太好使

hitgds 发表于 2020-10-10 17:03:53

本帖最后由 hitgds 于 2020-10-10 17:06 编辑

myoperator myoperator::operator++(int) 返回的是一个临时变量,是一个纯右值(将亡值),纯右值只能绑定到常左值引用(const myoperator&)或者右值引用(myoperator&&)
加一个 friend ostream& operator<<(ostream& cout, const myoperator& p1); 或者 friend ostream& operator<<(ostream& cout, myoperator&& p1);就可以了
页: [1]
查看完整版本: 【求助帖】C++关于后置++重载 出现报错