Еще одна причина в вашем примере - это должно быть friend
, потому что это единственный способ определить свободную функцию внутри определения класса. Если вы хотите использовать функцию, не являющуюся другом, ее нужно определить вне класса.
Почему вы предпочитаете определять это в классе? Иногда полезно определить все операторы вместе:
struct SomeClass {
// blah blah blah
SomeClass &operator+=(const SomeClass &rhs) {
// do something
}
friend SomeClass operator+(SomeClass lhs, const SomeClass &rhs) {
lhs += rhs;
return lhs;
}
// blah blah blah
// several pages later
};
может быть немного более удобным, чем:
struct SomeClass {
// blah blah blah
SomeClass &operator+=(const SomeClass &rhs) {
// do something
}
// blah blah blah
// several pages later
};
SomeClass operator+(SomeClass lhs, const SomeClass &rhs) {
lhs += rhs;
return lhs;
}
Это, конечно, предполагает, что вы определяете связанные функции-члены в определении класса, а не объявляете их там и определяете их в файле .cpp.
Редактировать: я использовал + = и + в качестве примера, не задумываясь об этом, но ваш вопрос касается operator<<
, который не имеет тесно связанных операторов, как operator+
. Но если operator<<
вызывает одну или несколько функций-членов, связанных с печатью, вы можете определить ее рядом с тем местом, где они определены.