在cpp中重载<<运算符的正确方法是啥[重复]
Posted
技术标签:
【中文标题】在cpp中重载<<运算符的正确方法是啥[重复]【英文标题】:What is the the correct way in Overloading the << Operator in cpp [duplicate]在cpp中重载<<运算符的正确方法是什么[重复] 【发布时间】:2021-10-28 05:12:54 【问题描述】:我尝试将
ostream& operator<< (ostream& output, const Box& B)
output << B.l << " " << B.b << " " << B.h;
return output;
我尝试将如上所示的
friend ostream& operator<< (ostream& output, const Box& B)
output << B.l << " " << B.b << " " << B.h;
return output;
【问题讨论】:
是的,正如您已经检查过的,第二个解决方案是正确的。 “没用”不是对问题的描述,虽然我猜你忘记标记第一个方法static
。
【参考方案1】:
在这个伪示例中
class Thing
...
void work(int arg);
...
;
成员函数是一种种函数,隐含地将Thing
作为第一个参数,就像my_thing.work(12)
是work(my_thing, 12)
。
这绝对不是一个有效的替代,而只是为其余的解释提供思路。
回到你的例子,当你写std::cout << my_box
时,编译器理解运算符<<
的用法,因为这个函数调用operator<<(std::cout, my_box)
。
如果operator<<
for Box
是std::cout
的成员函数,这可能会起作用,但实际上标准流对您的Box
类型一无所知。
如果您提供operator<<
作为Box
的成员函数,则意味着左操作数(如上面的伪示例中所述可以被视为隐藏的第一个参数)应该是@987654334 @。
但是当你写std::cout << my_box
时,左边的操作数不是Box
而是std::cout
。
在这种情况下,唯一的解决方案是以正确的顺序提供具有预期参数的 非成员 函数,因此您尝试并发现第二个解决方案有效。
【讨论】:
以上是关于在cpp中重载<<运算符的正确方法是啥[重复]的主要内容,如果未能解决你的问题,请参考以下文章