Вот один пример:
Когда вы перегружаете << 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).