[问题] operator overloading <<

楼主: moebear (萌熊)   2017-05-02 03:04:23
开发平台(Platform): (Ex: Win10, Linux, ...)
win 10 / linux
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
G++ / VC++
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(Question):
我在做大数的library(作业)
请问为什么在做<<的时候,obj一定要用const?
如果不是const的话,会编译不过。
喂入的资料(Input):
//a,b,c是class
cout << a*b; // 这样打会编译失败
cout << a; // 但是这样打可以
c=a*b;
cout << c; // 这样打也可以
预期的正确结果(Expected Output):
加上const
错误结果(Wrong Output):
程式码(Code):(请善用置底文网页, 记得排版)
ostream & operator << (ostream & str, const BigNum & obj)
作业已经demo了 贴上来应该没关系
http://ideone.com/ifYD2i
补充说明(Supplement):
在visual studio 里面可以编译成功,但是g++会失败。
作者: steve1012 (steve)   2017-05-02 03:09:00
为什么都不付一下source code
楼主: moebear (萌熊)   2017-05-02 03:11:00
我觉得比较属于概念性的问题
作者: steve1012 (steve)   2017-05-02 03:17:00
看起来是因为你用lvalue ref. 不能抓temporary variablea*b是rvalue吧没付code 的话可以尽量解释清楚一点 这样大家比较好找问题 像是什么是''obj 一定要const?'' 是指 overload的operator 的参数是const 还是在说你传进去的物件一定要是const 预期的正确结果那边写一个加上const 也不太清楚是什么东西加上const
楼主: moebear (萌熊)   2017-05-02 03:26:00
主要就是程式码那边的那行 为什么要加上const*会return一个我定义的class. BigNum
作者: steve1012 (steve)   2017-05-02 03:39:00
C++不允许你直接抓temporary object 然后改他的值 所以你要用const lvalue reference当然现在有rvalue reference 能做这件事(改值)概念是 a*b是一个temporary object. 你并没有给他一个名字 所以他马上就会消失 让user 改他的值并没有什么意义(可能还有别的考量点)
作者: johnhmj (耗呆肥羊)   2017-05-02 07:19:00
你有没有写 BigNum& operator*(const BigNum& obj)?
作者: hunandy14 (Charlott.HonG)   2017-05-02 11:50:00
记得是规范 但是规范跟实作是两回事编译器守不守他的事大前提很明白 obj 你不会动到 所以加上constostream 你需要动到他不能加 const这里 a*b 返回值是 const 所以你参数不加会找不到更正 rvalue ^const
作者: steve1012 (steve)   2017-05-02 12:54:00
Bind rvalue 要么用rval reference 要么用const lvaluereference
作者: s4300026 (s4300026)   2017-05-02 18:51:00
我猜是重载运算子,右侧变量加上const
作者: pttworld (批踢踢世界)   2017-05-02 19:35:00
贴一下你的乘,回传是什么
楼主: moebear (萌熊)   2017-05-02 20:19:00
回传是BigNum 我定义的class
作者: hunandy14 (Charlott.HonG)   2017-05-02 20:25:00
应该是要你传 op*() 前面是什么 有没有 * & const还是就什么都没有~
楼主: moebear (萌熊)   2017-05-02 20:47:00
已补充程式码看起来应该是因为他是暂存的值 不能用ref去传入我试着把const跟&一起拿掉就可以了
作者: hunandy14 (Charlott.HonG)   2017-05-02 22:06:00
一起补上是比较好的cst BigNum op*(cst BigNum& A2, cst BigNum& B2)istream& op>>(istream& str, cst BigNum& obj)
作者: steve1012 (steve)   2017-05-02 22:41:00
暂存值可以传 只是规定要const lval reference 或是传copy 但传copy 可能不efficient传lvalue reference 是一个& rvalue 是两个&&
作者: Killercat (杀人猫™)   2017-05-03 19:13:00
话说你可以直接解释一下 你的case为什么可能非const?
楼主: moebear (萌熊)   2017-05-03 20:45:00
什么意思
作者: Killercat (杀人猫™)   2017-05-04 07:29:00
"请问为什么在做<<的时候,obj一定要用const?"答案是这是operator spec,然而这spec对你来讲有什么case让你碰到困难,一定得mutable吗?可以提出来大家帮你看看 拿一下主义诶,我好像有点误解你问的问题,我看看我刚帮你看了一下 clang看起来可以cout << a*b
作者: steve1012 (steve)   2017-05-04 14:51:00
所以我一开始才说问问题要问清楚...

Links booklink

Contact Us: admin [ a t ] ucptt.com