假设它们没有被实现为friend
函数。
class Foo
{
// in here?
ostream& operator<<( ostream&, const Foo & );
};
或
class Foo
{
};
// out here?
ostream& operator<<( ostream&, const Foo & );
为什么?
答案 0 :(得分:1)
将它们声明为非成员朋友函数或Foo的周围名称。你的第一个例子是缺少关键成分:朋友。
原因是C ++寻找函数(以及运算符)的方式来调用:依赖于参数的查找。
答案 1 :(得分:0)
引自Stanley Lippman的++入门书:
当我们定义符合iostream库约定的输入或输出运算符时,我们必须将其作为非成员函数。
一种选择是将类的重载<<
或>>
声明为friend
函数。
将其声明为friend
函数的好处是它可以访问类的私有部分。
class Foo
{
// in here?
friend ostream& operator<<( ostream&, const Foo & );
//^^should not miss this
};
另一个选项是重载为free
函数,为operator<<
类实现Foo
的规范方法是:
std::ostream& operator<<(std::ostream& os, const Foo & )
{
}
这种方式无法直接访问类的私有部分,需要提供一些成员函数来返回类的内部进行打印。
这取决于您的应用程序,第二种方式通常是canonical
方式。