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

1 ... 261 262 263 [ 264 ] 265 266 267 ... 395


template <int hi, int wid> class Screen { ... };

const short shi = 4 0; const short swi = 132;

расширения типов:

Screen< shi, swi > bpObj2; расширения типа short до int

template <unsigned int size> Buf{ ... }; преобразования целых типов:

Buf< 1024 > bpObj; преобразование из int в unsigned int (Более подробно они описаны в разделе 9.3.)

extern void foo( char * ); extern void bar( void * ); typedef void (*PFV)( void * ); const unsigned int x = 1024;

template <class Type,

unsigned int size, PFV handler> class Array { ... };

Array<int, 1024U, bar> a0; правильно: преобразование не нужно Array<int, 1024U, foo> a1; ошибка: foo != PFV

Array<int, 1024, bar> a2; правильно: 1024 преобразуется в unsigned int

Array<int, 1024, bar> a3; ошибка: foo != PFV

A\rray<int, x, bar> a4; правильно: преобразование не нужно

Рассмотрим следующие объявления:

A\rray<int, x, foo> a5; ошибка: foo != PFV

Объекты a0 и a4 класса Array определены правильно, так как аргументы шаблона точно соответствуют типам параметров. Объект a2 также определен правильно, потому что аргумент 1024 типа int приводится к типу unsigned int параметра-константы size с помощью преобразования целых типов. Объявления a1, a3 и a5 ошибочны, так как не существует преобразования между любыми двумя тинами функций.

Приведение значения 0 целого типа к типу указателя недопустимо:

Ptr< &iObj > pObj; преобразование из int* в const int*



template <int *ptr>

class BufPtr { ... };

ошибка: 0 имеет тип int

неявное преобразование в нулевой указатель не применяется

BufPtr< 0 > nil; Упражнение 16.3

Укажите, какие из данных конкретизированных шаблонов действительно приводят к

template < class Type > class Stack { };

void f1( Stack< char > ); (a)

class Exercise {

...

Stack< double > &rsd; (b) Stack< int > si; (c)

int main() {

Stack< char > *sc; (d) f1( *sc ); (e)

int iObj = sizeof( Stack< string > ); (f)

конкретизации:

Упражнение 16.4

template < int *ptr > class Ptr ( ... };

template < class Type, int size > class Fixed Array { ... }; Какие из следующих конкретизаций шаблонов корректны? Почему?

(a) const int size = 1024;

template < int hi, int wid > class Screen { ... };

(b) int arr[10]; Ptr< arr > bp2;

Ptr< &size > bp1; (c) Ptr < 0 > bp3;



(d) const int hi = 40; const int wi = 80;

(e) const int size val = 1024;

(f) unsigned int fasize = 255; Screen< hi, wi+32 > sObj; Fixed Array< string, size val > fa1;

(g) const double db = 3.1415;

Fixed Array< int, fasize > fa2;

Fixed Array< double, db > fa3;

16.3. Функции-члены шаблонов классов

Как и для обычных классов, функция-член шаблона класса может быть определена либо внутри определения шаблона (и тогда называется встроенной), либо вне его. Мы уже встречались со встроенными функциями-членами при рассмотрении шаблона Queue. Например, конструктор Queue является встроенным, так как определен внутри

template <class Type> class Queue {

...

public:

встроенный конструктор

Queue() : front( 0 ), back( 0 ) { } ...

определения шаблона класса: };

При определении функции-члена шаблона вне определения самого шаблона следует применять специальный синтаксис для обозначения того, членом какого именно шаблона является функция. Определению функции-члена должно предшествовать ключевое слово template, за которым следуют параметры шаблона. Так, конструктор Queue можно определить следующим образом:



1 ... 261 262 263 [ 264 ] 265 266 267 ... 395

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