C++重载自定义类型的后置递增运算符出错,求大佬

JAY CC 2020-08-30 01:44:58
代码我觉得也没啥毛病,怎么就出错了呀,是编译器的问题吗,还是我哪个地方弄错了,太难了
...全文
1273 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
小男孩h 2021-03-11
  • 打赏
  • 举报
回复 7
C++中产生的临时对象是不可修改的,及默认为const的,非const引用只能绑定到与该引用同类型的对象,但是非常量对象可以绑定到const引用上, 因此可以去掉去掉<<重载参数的类的引用符 即 &或者加上const变为常量引即std::ostream & operator << (std::ostream &out, const myInteger &myclass)
JAY CC 2020-11-15
  • 打赏
  • 举报
回复
引用 6 楼 菜咬狗的回复:
去掉<<重载参数的类的引用符 即 &,友元在类中的申明也要去& ostream & operator << (std::ostream &out, myInteger myclass);
ok,懂了懂了
  • 打赏
  • 举报
回复
去掉<<重载参数的类的引用符 即 &,友元在类中的申明也要去& ostream & operator << (std::ostream &out, myInteger myclass);
JAY CC 2020-08-30
  • 打赏
  • 举报
回复
引用 3 楼 alittlenewbiek的回复:
正如你说的,suffix increment返回的不是引用,只是临时空间里的值。

operator <<的重载声明里,myInter是引用类型,
而引用类型是不能引用临时变量或者常量的,
所以编译器会抱怨找不到operator <<的定义。

解决方法我提供4种
1,不使用引用,那么重载的原型是
std::ostream & operator << (std::ostream &out, myInteger myclass)

2,为了依旧使用引用,可以定义两个重载函数
std::ostream & operator << (std::ostream &out, myInteger &&myclass) // 右值引用
std::ostream & operator << (std::ostream &out, myInteger &myclass) // 左值引用

3,如果不介意使用const的话,可以定义重载函数为
std::ostream & operator << (std::ostream &out, const myInteger &myclass)

4,const至少对于你现在的定义是没有什么影响的,但如果const真的带来了影响,而又觉得第2种比较麻烦,
可以使用万能引用universal reference
template<class T>
std::ostream & operator << (std::ostream &out, T &&myclass)
{
out << std::forward<T>(myclass).m_int;
return out;
}

std::forward可以不用、忽略,这样利用模板的类型推演,
能自动识别左值还是右值
我用了你的方法,后置++类型的数据可以这样写了,cout<<“(p++)++”<<endl;没报错,但是结果没累加,而内置数据类型是不可以这样加的,直接报错
JAY CC 2020-08-30
  • 打赏
  • 举报
回复
我懂了太感谢了😊😊
alittlenewbiek 2020-08-30
  • 打赏
  • 举报
回复 3
正如你说的,suffix increment返回的不是引用,只是临时空间里的值。

operator <<的重载声明里,myInter是引用类型,
而引用类型是不能引用临时变量或者常量的,
所以编译器会抱怨找不到operator <<的定义。

解决方法我提供4种
1,不使用引用,那么重载的原型是
std::ostream & operator << (std::ostream &out, myInteger myclass)

2,为了依旧使用引用,可以定义两个重载函数
std::ostream & operator << (std::ostream &out, myInteger &&myclass) // 右值引用
std::ostream & operator << (std::ostream &out, myInteger &myclass) // 左值引用

3,如果不介意使用const的话,可以定义重载函数为
std::ostream & operator << (std::ostream &out, const myInteger &myclass)

4,const至少对于你现在的定义是没有什么影响的,但如果const真的带来了影响,而又觉得第2种比较麻烦,
可以使用万能引用universal reference
template<class T>
std::ostream & operator << (std::ostream &out, T &&myclass)
{
out << std::forward<T>(myclass).m_int;
return out;
}

std::forward可以不用、忽略,这样利用模板的类型推演,
能自动识别左值还是右值
JAY CC 2020-08-30
  • 打赏
  • 举报
回复
引用 1 楼 qybao的回复:
你的<<需要的是引用类型的参数,而++返回的不是引用类型,所以参数不匹配
后置++不是不能返回&这个吗,只能返回值吧
qybao 2020-08-30
  • 打赏
  • 举报
回复
你的<<需要的是引用类型的参数,而++返回的不是引用类型,所以参数不匹配

65,189

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧