Вот один пример: При перегрузке << operator
для class T
подписи будет:
std::ostream operator<<(std::ostream& os, T& objT)
, где необходимо осуществление быть
{
//write objT to the os
return os;
}
Для <<
оператора первом аргументом должен быть объект ostream, а второй аргумент - объект класса T.
Если вы попытаетесь определить operator<<
как функцию члена, вы не сможете определить его как std::ostream operator<<(std::ostream& os, T& objT)
. Это связано с тем, что функции-члены двоичного оператора могут принимать только один аргумент, а вызывающий объект неявно передается в качестве первого аргумента с использованием this
.
Если вы используете подпись std::ostream operator<<(std::ostream& os)
в качестве функции-члена, вы на самом деле будете иметь функцию-член std::ostream operator<<(this, std::ostream& os)
, которая не будет делать то, что вы хотите. Поэтому вам нужен оператор, который не является функцией-членом и может получить доступ к данным о членах (если ваш класс T имеет личные данные, которые вы хотите передать, operator<<
должен быть другом класса T).
@BROY Ваши изменения неверны, функция _non-member_ необязательно является _friend_. (И я также обнаружил, что ваше изменение изменило [много] (http://stackoverflow.com/posts/1132600/revisions) на исходный вопрос.) –