Глава 19. Классы-шаблоны___________________________________529
14 |
// К величайшему сожалению, этого не избежать: |
15 |
// typedef dummyVector никогда не используется; он определен |
16 |
// здесь только для того, чтобы гарантировать, что определен |
17 |
// хотя бы один экземпляр |
13 |
typedef VECTOR<int, 10> dummy Vector ; |
19 |
ftendif |
20 |
// VECTOR.CPP — Определения методов класса-шаблона VECTOR |
21 |
#include "vector.h" |
22 |
template <class T, unsigned long SIZE> |
23 |
VECTOR<T, SIZE>::VECTOR(){}; |
24 |
template <class T, unsigned long SIZE> |
25 |
TS VECTOR<T, SIZE>::operator[]( unsigned long j) |
26 |
( |
27 |
return j < SIZE ? data[j] : data[SIZE]; |
28 |
} |
29 |
#ifdef VECTORSCAFFOLD |
30 |
ftinclude <iostream.h> |
31 |
void main() |
32 |
{ < |
33 |
VECTOR<float, 5> fv; |
34 |
fv[0] = 1.0; |
35 |
fv[l] = 2.0; |
36 |
fv[2] = 3.0; |
37 |
fv[3] = 4.0; |
38 |
fv[4] = 5.0; |
39 |
cout.setf( ios::fixed); |
40 |
for(int i = 0; i < 5; i++) |
41 |
// Используется как правосторонний аргумент |
42 |
cout « fv[i] « endl; |
431 |
VECTOR<char*, 3> cv; |
44 |
cv[0] = "Раз"; |
45 |
cv[l] = "Два"; |
46 |
cv[2] = "Три"; |
47 |
cout « cv[0] « " " « cv[l] « " " « cv[2] « endl; |
48 |
) |
49 |
#endif |
Замечание
Сочетание классов-шаблонов и наследования может породить проблемы. (Borland International не единственная фирма, столкнувшаяся с этим; теми же проблемами страдает еще ряд компиляторов C++, поддерживающих шаблоны).
Проблема появляется при наследовании из классов-шаблонов. Компилятор оказывается неспособным корректно построить базовый класс. Для решения этой проблемы есть обходной путь: используйте спецификатор typedef после объявления базового класса, как это сделано в строке 18 файла vector.h. Это заставит компилятор сгенерировать заданную версию параметризованного класса.