Глава 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. Это заставит компилятор сгенерировать заданную версию параметризованного класса.