ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Ошибка: нельзя определить, какую // реализацию вызвать!Шаблон может иметь несколько параметров. template <class T1, class T2> void SomeFunc(T1 a, T2 b) { … } Нельзя параметризовать возвращаемое значение. При обнаружении шаблона функции компилятор не предпринимает никаких действий. При обнаружении попытки вызова функции компилятор порождает код функции, соответствующий реальным типам параметров – создается версия функции (процесс называется “ инстанцирование ” – instantiation).
Шаблон может иметь в качестве параметра не только тип данных, но и обычную переменную. Пример: template <class T1, class T2, int i> void SomeFunc(T1 a, T2 b) { … } При использовании шаблона существует возможность явного указания типов аргументов: template <class T1, class T2> void SomeFunc(T1 a, T2 b) { … } … SomeFunc<int, double>(1, 2.4); Шаблоны функций могут быть перегружены как при помощи обычных функций, так и при помощи шаблонов. Т.о., Вы имеете возможность создать функцию с тем же именем и другим списком параметров. В этом случае компилятор каждый раз пытается разобраться, что именно Вы пытаетесь вызвать. Пусть реализован шаблон функций, которая меняет местами значения параметров: template <class T> void MySwap(T& a, T& b) T c; c = a; a = b; b = c; } Для стандартных типов все работает. Если в качестве параметра шаблона выступает класс, то в этом классе должна быть реализована операция присваивания. Можно создать так называемую “ специализацию ” шаблона, реализовав особое поведение для некоторых типов параметров. template <class T> void MySwap(T& a, T& b) T c; c = a; a = b; b = c; } void MySwap<TMyCl>(TMyCl& a, TMyCl& b) { … } Мы разобрались с параметризацией функций путем создания шаблонов функций. Аналогичным образом можно создавать шаблоны классов. Рассмотрим пример: класс динамический массив. class TVector { private: double *pVector; int iSize; public: TVector(int s=10); TVector(const TVector &v); ~TVector(); int GetSize() const { return iSize; } double GetValue(int pos) const; void SetValue(int pos, double value); TVector Add(const TVector &v) const; TVector AddEq(const TVector &v); double Mult(const TVector &v) const; void Print() const; void Input(); TVector& operator-(); TVector& operator+=(const TVector& v); TVector operator+(const TVector& v); double operator*(const TVector& v); TVector operator*(double d); double& operator[](int i); const TVector& operator=(const TVector& v); }; template <class TElement> class TVector { private: TElement *pVector; int iSize; public: TVector(int s=10); TVector(const TVector &v); ~TVector(); … Внимание: метод шаблона есть шаблон функции. Реализацию методов параметризованного класса необходимо писать в том же файле, где и объявление. Пример: template <class TElement> TVector<TElement>::TVector(const TVector& v) { iSize = v.GetSize(); pVector = new TElement[iSize]; for (int i = 0; i < iSize; i++) pVector[i] = v.GetValue(i); } TVector<double> v(20); … Не нашли, что искали? Воспользуйтесь поиском:
|