Почему этот код должен выдавать ошибку?Для каждого T
, с которым вы создаете экземпляр A
, будет объявлена и добавлена новая функция.Никогда не будет двух одинаковых функций, так как вы не можете дважды создать экземпляр шаблона для одного и того же типа (вы просто повторно используете старый экземпляр).
Кроме того, даже если бы было так или иначе возможно сгенерировать два равных объявления, не было бы никакой двусмысленности, так как функции сначала объявляются внутри класса.Как таковые, они никогда не могут быть найдены ничем, кроме поиска, зависящего от аргумента.(По сути, эти функции бесполезны, так как их нельзя вызвать)
§7.3.1.2 [namespace.memdef] p3
[...] Если объявление friend
в нелокальном классе сначала объявляет классили функция. Другим классом или функцией является член внутреннего пространства имен. Имя друга не найдено ни в неквалифицированном поиске, ни в квалифицированном поиске, пока не будет предоставлено соответствующее объявление в этой области пространства имен (ни до, ни после определения класса, предоставляющего дружбу).[...]
Также, посмотрите это .