Оператор должен быть функцией free , потому что его первый аргумент не того же типа, что и ваш класс.В общем, когда вы перегружаете бинарный оператор Foo
, версия функции-члена принимает только один аргумент, а FOO(a, b)
означает a.Foo(b)
.
, поскольку a << b
вызовет a.operator<<(b)
, но a
- это поток, он нам не нужен.
Так что сделайте свободную функцию или, возможно, бесплатную функцию друга.Наличие открытой toString
функции-члена может помочь:
class Foo {
public:
std::string toString() const;
// ...
};
std::ostream & operator<<(std::ostream & o, const Foo & x) {
return o << x.toString();
}