Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 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);






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных