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