Согласно
стандарту, дружественная функция может быть определена по месту объявления только для нелокального класса и только если имя функции не является квалифицированным.
Первое ограничение нас мало интересует, а второе - является довольно существенным.
Первично объявленная дружественной функция, согласно
стандарту, становится участником пространства имен того типа, для которого объявлена дружественной.
Получаем такую ситуацию. У нас есть пространство имен, пусть даже глобальное, в котором определяется тип. Во время определения этого типа делается первичное объявление функции как дружественной этому типу. В результате этого функция, как бы, объявляется принадлежащей пространству имен в котором определяется тип, но не совсем.
Функция
f5
не просто первично объявлена, она и определена по месту объявления дружественности. Ее имя является однозначно неквалифицированным в следствии своего определения.
Еще из
стандарта мы можем узнать о том, что первично объявленное дружественное имя не может быть найдено средствами стандартного поиска квалифицированных или неквалифицированных имен.
Именно этот результат мы и можем наблюдать в вопросе. Имя
f5
не находится.
Все потому что т.н. имена
скрытых друзей могут быть найдены только средствами
ADL.
Если коротко, Argument-Dependent Lookup опирается на типы аргументов при вызове функции, пространства их имен и пространства имен, в которых эти типы объявлены.
ADL не выполняет поиск в пространствах имен в отношении
фундаментальных типов. Поэтому код
f5(5);
буквально обречен на ошибку трансляции.
Первично объявленная дружественной функция будет исключительно ADL-доступной до момента своего объявления или определения в том же пространстве имен, в котором определен тип друга. В этом случае функция станет доступна для поиска квалифицированных или неквалифицированных имен.
Для
f5
доступен только способ с повторным объявлением, т.к. она уже определена.
Да только в этом случае
f5
окончательно потеряет всякий смысл быть дружественной для
A
и станет просто сильно спрятанной и сбивающей с толку глобальной функцией.
Суть дружественности в раскрытии доступа, которым
f5
относительно
A
не пользуется, т.к. среди ее параметров нет ни одного с типом
A
.
В результате.
Чтобы ADL нашел функцию
f5
, среди ее параметров обязан быть параметр и с типом
A
.
Чтобы UNL или QNL смогли найти функцию
f5
, ее надо дополнительно объявить за пределами типа
A
в его пространстве имен.