Программирование >>  Инициализация объектов класса, структура 

1 ... 263 264 265 [ 266 ] 267 268 269 ... 395


!! queue executed ok

Упражнение 16.5

Используя шаблон класса Screen, определенный в разделе 16.2, реализуйте функции-члены Screen (см. разделы 13.3, 13.4 и 13.6) в виде функций-членов шаблона.

16.4. Объявления друзей в шаблонах классов



обычный (не шаблонный) дружественный класс или дружественная функция. В следующем примере функция foo() , функция-член bar() и класс foobar

class Foo {

void bar();

T>

template <class class QueueItem

friend class foobar; friend void foo(); friend void Foo::bar();

...

объявлены друзьями всех конкретизаций шаблона QueueItem:

Ни класс foobar, ни функцию foo() не обязательно объявлять или определять в глобальной области видимости перед объявлением их друзьями шаблона QueueItem.

Однако перед тем как объявить другом какой-либо из членов класса Foo, необходимо определить его. Напомним, что член класса может быть введен в область видимости только через определение объемлющего класса. QueueItem не может ссылаться на Foo::bar(), пока не будет найдено определение Foo;

связанный дружественный шаблон класса или функции. В следующем примере определено взаимно однозначное соответствие между классами, конкретизированными по шаблону QueueItem, и их друзьями - также конкретизациями шаблонов. Для каждого класса, конкретизированного по шаблону QueueItem, ассоциированные конкретизации foobar, foo() и

template <class Type> class foobar { ... };

template <class Type>

void foo( QueueItem<Type> );

template <class Type>

class Queue {

Queue void bar();

template <class Type> class QueueItem {

friend class foobar<Type>;

friend void foo<Type>( QueueItem<Type> );

friend void Queue<Type>::bar();

...

Queue::bar() являются друзьями.



template <class Type> class QueueItem {

template <class T>

friend class foobar;

template <class T>

friend void foo( QueueItem<T> );

template <class T>

friend class Queue<T>::bar();

...

конкретизации foobar, foo() и Queue<T>::bar() являются друзьями:

Следует отметить, что этот вид объявлений друзей в шаблоне класса не поддерживается компиляторами, написанными до принятия стандарта C++.

16.4.1. Объявления друзей в шаблонах Queue и QueueItem

Поскольку QueueItem не предназначен для непосредственного использования в вызывающей программе, то объявление конструктора этого класса помещено в закрытую

Прежде чем шаблон класса можно будет использовать в объявлениях друзей, он сам должен быть объявлен или определен. В нашем примере шаблоны классов foobar и Queue, а также шаблон функции foo() следует объявить до того, как они объявлены друзьями в QueueItem.

Синтаксис, использованный для объявления foo() другом, может показаться странным:

friend void foo<Type>( QueueItem<Type> );

За именем функции следует список явных аргументов шаблона: foo<Type>. Такой синтаксис показывает, что в качестве друга объявляется конкретизированный шаблон функции foo(). Если бы список явных аргументов был опущен:

friend void foo( QueueItem<Type> );

то компилятор интерпретировал бы объявление как относящееся к обычной функции (а не к шаблону), у которой тип параметра - это экземпляр шаблона QueueItem. Как отмечалось в разделе 10.6, шаблон функции и одноименная обычная функция могут сосуществовать, и присутствие объявления такого шаблона перед определением класса QueueItem не вынуждает компилятор соотнести объявление друга именно с ним. Для того, чтобы соотнесение было верным, в конкретизированном шаблоне функции необходимо указать список явных аргументов;

несвязанный дружественн1й шаблон класса или функции. В следующем примере имеется отображение один-ко-многим между конкретизациями шаблона класса QueueItem и его друзьями. Для каждой конкретизации тина QueueItem все



1 ... 263 264 265 [ 266 ] 267 268 269 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика