|
|
Шаблон типа для класса определяет как будут строиться классы, подобно тому, как описание класса определяет как будут строиться объекты этого класса. Шаблон типа для класса vector можно описать следующим образом:
template<class T> class vector { T* v; int sz; public: vector(int); T& operator[](int); T& elem(int i) { return v[i] } // ... };
Префикс template<class T> показывает, что описывается шаблон типа,
и что в этом описании используется имя-типа T, иными словами,
vector - это параметризованный тип с параметром T.
Класс можно задать с помощью конструкции имя-шаблонного-класса:
имя-шаблонного-класса:
имя-шаблона-типа < список-парам-шаблона-типа >
список-парам-шаблона-типа:
парам-шаблона-типа
список-парам-шаблона-типа , парам-шаблона-типа
парам-шаблона:
выражение
имя-типа
Конструкция имя-шаблонного-класса является именем-класса ($$R.9).
Класс, который порождается шаблоном типа для класса, называется
шаблонным классом и эквивалентен обычному классу, определенному со
специальным именем - именем-шаблонного-класса, см. $$R.14.5.
Если в конструкции имя-шаблонного-класса имя-шаблона-типа не определено,
то она обозначает неопределенный класс.
Имя шаблонного класса должно быть уникальным в программе и в своей
области видимости оно не может обозначать другой шаблон типа,
класс, функцию, объект, значение или тип.
Типы, указанные в списке-парам-шаблона-типа из
имени-шаблонного-класса, должны соответствовать типам, заданным
в списке-параметров-шаблона-типа из шаблона-типа. (Можно сказать,
что первые являются фактическими параметрами шаблона типа, а вторые
- формальными.)
Кроме типов в списке-парам-шаблона-типа могут быть:
выражения-константы, адреса объектов или функций, подлежащих внешнему
связыванию, статические члены классов. Для параметров, не
являющихся типами, требуется точное соответствие ($$R.13.2).
Приведем примеры использования классов шаблона типа vector:
vector<int> v1(20); vector<complex> v2(30); typedef vector<complex> cvec; // cvec становится синонимом // vector<complex> cvec v3(40); // v2 и v3 одного типа v1[3] = 7; v2[3] = v3.elem(4) = complex(7,8);
Здесь vector<int> и vector<complex> являются шаблонными классами,
и их определения берутся по умолчанию из шаблона типа vector.
Поскольку шаблонное-имя-класса является именем-класса, то оно может
использоваться там, где допустимо имя-класса, например:
class vector<Shape*> vector<Window>* current_window; class svector : public vector<Shape*> { /* ... */ };
Определение функции-члена шаблонного класса дано в $$R.14.6.
| |