Ты однако не счел нужным заметить показанный мною ЧЕТВЕРТЫЙ способ. БЦЦ у меня нет, проверить не смогу. Дело за тобой.
template<class>class A;
template<class T>
A<T> operator + (const A<T> &, const A<T> &);
template<class T>
class A
{
friend operator +<T>(const A&, const A &);
};
Здесь другом объявлена
специализация шаблонной функции
C>p.s.
C>С шаблоном оператора я примерно понял, почему так. Хотя, не до конца. Можно маленький ликбез?
C>template <class T> friend fun(Foo2<T>);
C>-- ссылка в объявлении на friend-функцию, которая шаблон? Так?
Да, об этом раза 4 сказали уже.
C>C>friend fun(Foo2<T>);
C>
C>-- ссылка на friend-функцию, которая просто функция. Так?
Да.
C>А как правильно трактовать ситуацию, когда я потом пишу шаблон этой функции:
C>C>template <class T>
C>fun (Foo2<T> a)
C>{
C>...
C>}
C>
C>Это определение будет распознаваться как то-самое, на которое мы ссылаемся по
C>а) Первому методу (ну, это очевидно)
C>б) Второму? (вот в чем вопрос)
Какой вопрос? Это же шаблон функции, а во втором случае другом объявлена нешаблонная функция.