logo
шпоры по ООП

60.Дружественные шаблоны.

Обычно при объявлении дружественной конструкции, которая является экземпляром шаблона функции или класса, можно точно указать, что именно должно быть дружественным. Иногда, однако, желательно, чтобы дружественными по отношению к классу были все экземпляры шаблона. Отсюда вытекает понятие так называемого дружественного шаблона.

class Manager{

template<typename T>

friend class Task;

template <typename T>

friend void Shedule<T>::dispatch{Task<T>*};

template <typename T>

friend int ticket(){

return ++Manager::counter;}

static int counter;

}

Так же, как и в случае обычных объявлений дружественных конструкций, дружественный шаблон может быть определением, только если он именует неполное имя функции, за которым следуют угловые скобки. Дружественными шаблонами могут быть только первичные шаблоны и их члены. Любые частичные и иные специализации, связанные с первичным шаблоном, автоматически являются дружественными.

Шаблоны классов могут содержать друзей. Friend функция, не использующая спецификацию шаблона, будет универсальной friend для всех экземпляров шаблона класса. Friend функция, которая включает шаблоны параметров - особо friend только для того класса, экземпляр которого создается.

template <class T>

class matrix {

friend void foo_bar(); // универсальная

friend vect <T> product(vect <T> v); // создается экземпляр };