Действительно, этот оператор может быть определен в области имен без friend
.
Вам не «нужно» делать это friend
в этом случае, именно по тем причинам, которые вы приводите, поэтому неясно, откуда вы слышали, что делаете!
struct Address
{
string street;
string cross;
int suite;
};
inline ostream& operator<<(ostream& oss, const Address& other)
{
oss << "street: " << other.street << "cross: " << other.cross << "suite: " << other.suite;
return oss;
}
(я сделал это inline
при условии, что вы сохраняете все определение в заголовке, хотя в действительности я, вероятно, объявил бы его в заголовке, а затем определил бы его в другом месте.)
Однако класс, определенный с помощью struct
, по-прежнему является просто классом и все еще может содержать private
членов. Если бы у вас был тот, который сделал, вам снова понадобится friend
.
Некоторые люди могут всегда сделать friend
функцию для согласованности, чтобы определение operator<<
выглядело как «в» классе, когда вы читаете его. В качестве альтернативы могут быть некоторые загадочные ограничения поиска, которые делают это удобным (так как определенная таким образом функция friend
может быть найдена только ADL), хотя я не могу думать ни о чем из головы.