Пример определения друзей для шаблона класса
// предварительные объявления для дружественной функции-шаблона
template<class T> class task; // есть класс-шаблон
template<class T> task<T>* preempt(task<T>*);
// есть функция-шаблон, у которой аргумент - класс-шаблон
template<class T> class task {
// ...
friend void next_time(); // друг - обычная функция
friend void process(task<T>*); // друг - экземпляр перегруженной функции
// (не шаблон)
// друг - конкретная инстанция шаблона функции
// с соответствущими аргументами;
friend task<T>* preempt<T>(task<T>*);
// друг - функция-шаблон с таким же аргументом, как у класса
// этот друг требует предварительных объявлений см. выше
template<class C> friend int func(C); // все инстанции шаблонной функции
// с любыми аргументами
friend class task<int>; // друг - конкретная инстанция класса-шаблона
template<class P> friend class frd; // друг - все инстанции класса-шаблона
// ...
};