我尝试重载<<操作符直接显示在类的公共部分,但它不起作用
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;
}
在这个伪示例中
class Thing
{
...
void work(int arg);
...
};
成员函数是隐式地以Thing
作为第一个参数的类函数,就像my_thing.work(12)
是work(my_thing, 12)
一样。这绝对不是一个有效的替代,但它只是给出了解释的其余部分的想法。
回到您的示例,当您编写std::cout << my_box
时,编译器将操作符<<
理解为这个函数调用operator<<(std::cout, my_box)
。如果Box
的operator<<
是std::cout
的成员函数,这可以工作,但实际上标准流不知道任何关于Box
类型的信息。
如果您提供operator<<
作为Box
的成员函数,那么这意味着左操作数应该是Box
,它可以被认为是上面伪示例中描述的隐藏的第一个参数。但是当你写std::cout << my_box
时,左操作数不是Box
,而是std::cout
。