Справочное руководство по C++
Шрифт:
Здесь vector‹int› и vector‹complex› являются шаблонными классами, и их определения берутся по умолчанию из шаблона типа vector.
Поскольку шаблонное-имя-класса является именем-класса, то оно может использоваться там, где допустимо имя-класса, например:
Определение
R.14.3 Эквивалентность типов
Две конструкции шаблонное-имя-класса обозначают один и тот же класс, если в них совпадают имена шаблонов типа и значения указанных параметров. Например, в следующих описаниях x и y одного типа, который отличен от типа z:
Ниже приведены описания, в которых одинаковый тип имеют x2 и x3. Он отличается от типов x1 и x4:
R.14.4 Шаблоны типа для функций
Шаблон типа для функции определяет как будет строиться функция. Например, семейство функций sort можно описать следующим образом:
Шаблон типа для функции порождает неограниченное множество перегруженных функций. Функция, порождаемая шаблоном типа для функций, называется шаблонной функцией. Она эквивалентна функции, в описании которой указан тип, соответствующий шаблону, см. §R.14.5.
При вызове шаблонной функции параметры шаблона типа не задаются явно, вместо этого применяется правило разрешения неопределенности перегруженных функций. Рассмотрим пример:
Шаблонная функция может быть перегружена как обычными, так и шаблонными функциями с тем же именем. Для разрешения неопределенности шаблонных
[1] Попытаться найти точно сопоставимую вызову (§R.13.2) функцию, и если она найдена, вызвать ее.
[2] Попытаться найти шаблон типа для функций, по которому можно создать точно сопоставимую с рассматриваемым вызовом функцию. Если удалось найти, то вызвать функцию.
[3] Попытаться применить обычное правило разрешения неопределенности перегруженных функций (§R.13.2). Если с его помощью функция найдена, вызвать ее.
Если не найдено сопоставимой функции, вызов является ошибочным.
Если уже на первом шаге найдено более одного кандидата, сопоставимого с данной функцией, то вызов также считается неоднозначным и ошибочным.
Успешное выполнение шага [2] приведет к созданию некоторой шаблонной функции с параметрами (§R.14.5), типы которых точно сопоставятся с типами параметров, указанных в вызове. В этом случае недопустимо расхождение даже за счет тривиальных преобразований (§R.13.2).
Такие же действия применяются для сопоставления типов указателей на функции (§R.13.3).
Рассмотрим пример:
Добавив к этому примеру описание
можно разрешить неопределенность для третьего вызова, поскольку теперь задана функция, которая после стандартного преобразования char в int, может сопоставиться с вызовом max(a,c).
Определение шаблона типа для функции используется для создания различных вариантов шаблона типа. Для вызова определенного варианта достаточно лишь описания шаблона типа.
Каждый параметр-шаблона-типа, который приведен в списке-параметров-шаблона-типа должен обязательно использоваться при задании типов параметров в шаблоне типа для функции.
Все параметры-шаблона-типа, приведенные в шаблоне типа для функции, должны быть параметрами-типа.
R.14.5 Описания и определения
Для каждого имени шаблона типа в программе должно существовать только одно определение. Описаний может быть несколько. Определение используется для создания специальных шаблонных классов и шаблонных функций, которые будут соответствовать шаблону типа.