|
Программирование >> Инициализация объектов класса, структура
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 можно определить следующим образом:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |