如何避免重载输出运算符时的无穷递归问题

zhcosin 2012-12-20 04:15:25
我写了一个类variable,这个类提供了从double隐式转换为该类的能力(提供了接受一个double作为参数的复制构造函数和赋值运算符重载),现在的问题是,对输出运算符的重载面临一个隐式转换从而陷入无穷递归的陷阱:

friend ostream& operator<<( const ostream &outStream, const variable &theVariable)
{
return outStream<<(theVariable.Value());
}

由于可以从double隐式转换为variable,这导致了无穷递归从而栈溢出,可否有解决方法啊,求助。
...全文
189 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhcosin 2012-12-21
  • 打赏
  • 举报
回复
引用 4 楼 rocktyt2 的回复:
C/C++ code?12345template <class _Elem, class _Traits>friend basic_ostream<_Elem, _Traits>& operator<<(const basic_ostream<_Elem, _Traits> &outStream, const variable &theVariab……
果然,谢谢你。
rocktyt 2012-12-20
  • 打赏
  • 举报
回复
引用 7 楼 derekrose 的回复:
theVariable.Value()这是什么?这有可能是一个variable对象?怎么个无穷递归,那么可以做类型判断吗?做个判断不就ok了?
theVariable.Value()是double类型,但是在输出时double隐式转换为variable了
derekrose 2012-12-20
  • 打赏
  • 举报
回复
theVariable.Value()这是什么?这有可能是一个variable对象?怎么个无穷递归,那么可以做类型判断吗?做个判断不就ok了?
zhcosin 2012-12-20
  • 打赏
  • 举报
回复
引用 4 楼 rocktyt2 的回复:
C/C++ code?12345template <class _Elem, class _Traits>friend basic_ostream<_Elem, _Traits>& operator<<(const basic_ostream<_Elem, _Traits> &outStream, const variable &theVariab……
谢谢,我先试下,
oniisama 2012-12-20
  • 打赏
  • 举报
回复
另外写个名叫output之类的函数代替重载操作符
rocktyt 2012-12-20
  • 打赏
  • 举报
回复
template <class _Elem, class _Traits>
friend basic_ostream<_Elem, _Traits>& operator<<(const basic_ostream<_Elem, _Traits> &outStream, const variable &theVariable)
{
      return outStream<<(theVariable.Value());
}
rocktyt 2012-12-20
  • 打赏
  • 举报
回复
将ostream换成basic_ostream<_Elem, _Traits>模板 你的运算符重载不是模板,优先级比库里对basic_ostream<_Elem, _Traits>重载的优先级要高,因此重载决议时会优先找你的版本,换成basic_ostream<_Elem, _Traits>之后就解决了这个问题,同样是模板函数,编译器会找类型完全匹配的版本而非需要隐式转换的版本
zhcosin 2012-12-20
  • 打赏
  • 举报
回复
引用 1 楼 supermegaboy 的回复:
不知道explicit关键字?
explicit 把所有的隐式转换都拒绝了,但这个隐式转换是不能丢掉的,我这个类是实现变量的,当然需要这样的隐式转换。
飞天御剑流 2012-12-20
  • 打赏
  • 举报
回复
不知道explicit关键字?

64,654

社区成员

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

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