|
Программирование >> Программирование на языке c++
В любом случае, если есть несколько вариантов выбора функции, но имеет место неоднозначность выбора, то это рассматривается как ошибка. Ошибка будет и в том случае, если ни один вариант не найден. Рассмотрим пример: template <class Туре> Туре тах(Туре х,Туре у) { return {х>у)?х:у; } void main(void) { int a=1,b=2; char c=9,d=A; cout << integer max = max(a,b) endl; max(int,int) cout character max = max(c,d) endl; max(char,char) cout << character max = max(a,c) endl; ошибка, поскольку вариант max(int,char) не может быть сгенерирован по шаблону Здесь вызов функции тах(а,с) является ошибочным, поскольку для варианта max(int,char) нет шаблона (по нашему шаблону типы аргументов должны быть одинаковы). Ошибку можно устранить, если явно описать необходимые преобразования типов (т. е. ввести в рассмотрение первое и второе правила переопределения функции). Это можно сделать, поместив, например, перед функцией main объявление: char max(char,char); Здесь нет необходимости в дополнительном описании функции max, так как соответствующее описание можно сгенерировать из шаблона. Теперь последняя строка нашей программы даст следующий результат: character max = 9 При необходимости разные типы аргументов функции можно описать в ее шаблоне, например: template<class Туре 1,class Туре2> Туре1 max(Type1 х,Туре2 у) { return (х>у)?х:у; } Теперь строка cout character max = max(c,a) endl; будет давать гот же, что и в предыдущем случае, результат. Однако вызов функции max с другой последовательностью аргументов: cout << max(a,c); даст уже результат 57. Действительно, в первом случае мы использовали прототип char max(char,int) и результат выполнения тах(9,1) был 9. Возвращаемый результат имеет тоже тип char. Поэтому символьное значение 9 и было выведено на экран дисгшея. Однако во втором случае мы имеем другой прототип: int max(int,char). Если подставить значения аргументов, то вызов будет тах(1,9). Результат опять же будет 9, но представляется он уже в виде целочисленного значения, т. е. надо взять ASCII код символа 9, и он равен 57. Это значение и выводится на экран дисплея. Таким образом, использование двух и более аргументов-типов в шаблоне функции часто приводит к непредвиденным результатам, которые трудно прогнозировать, особенно при вычислении значений сложных выражений. Поэтому этот подход можно использовать, но все-таки при решении практических задач его лучше избегать и выполнять явное объявление новых версий функций, т. е. делать это так же, как в первом варианте функции max с разными типами аргументов. Рассмотрим примеры. Впервой программе задан шаблон для функции f и затем показаны некоторые разрешенные и некоторые запрещенные способы вызова этой функции. #include <iostream.h> template<class Т> Т f(T х,Т у) { return х-1-у; } void main(void) { cout f(22,33) endl; Результат: 55 cout f(23.2,3.6) endl; Результат: 26.8 cout f( {int)23.2,3.6); ошибка cout f{ (int)23.2, {int)3.6) endl; Результат: 26 int z = f(23.2,3.6); cout z endl; Результат: 26 int а=3; double b=7.8; cout f(a,b) endl; ошибка cout f{(double)a,b) endl; Результат; 10.8 Вторая программа демонстрирует устранение ошибки при вызове cout f( (int)23.2,3.6) после объявления функции int f(int,int). #include <iostreatn.h> template<class T> T f(T x,T y) { return x+y; } int f(int,int); char f(char x.int y) { return x+y; } void main(void) { cout f( {int)23.2,3.6) endl; Результат; 26 cout f(0,1) endl; Результат; 1 Если из программы удалить описание функции char f(char,int), то последний результат изменится с 1 на 49. Действительно, в соответствии с объявлением int f(int,int) оба аргумента будут преобразованы к типу int и (int)0 = 48,48 + 1 = 49. Третья программа демонстрирует использование рассмотренных выше правил выбора конкретной версии функции при вызове. #include <iostream.h> template<class Т> Т f(T х,Т у) шаблон для функции f { return x+y; } char f(char x.int y) { return x+y; } варианты функции f, int f(int x,char y) { return x+y; } которые нельзя построить no шаблону int f(int x,int y,int z) { return x+y+z; } void main(void) { char c1=0,c2=4; int i1=5,i2=10; cout f(i1,i2,c2) endl; Правило 1.Результат: 19 cout f(c1,c2) endl; Правило 2. Результат: 4 cout f(i1,i2) endl; Правило 2. Результат: 15
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |