Когда вы перегружаете бинарный оператор как функцию-член класса, перегрузка используется, когда операнд first относится к типу класса.
Для потоковых операторов первым операндом является поток, а не (обычно) пользовательский класс.
По этой причине перегруженные потоковые операторы для пользовательских классов, которые предназначены для обычного использования, не могут быть функциями-членами пользовательского класса, они должны быть свободными функциями.
(Я предполагаю, что потоковые классы не открыты для изменения; если бы они были, вы могли бы добавить функции-члены в потоковые классы, чтобы справиться с дополнительными пользовательскими типами, но это обычно нежелательно с точки зрения зависимости.)
То, являются ли они друзьями, должно зависеть от того, нужен ли им доступ непубличным членам класса.