2008-10-20 7 views
3

Ниже приведены строки из "C++ язык программирования"C++ шаблон функции перегрузки

template<class T > T sqrt(T); 
template<class T > complex<T> sqrt(complex<T>); 
double sqrt(double); 
void f(complex<double> z) 
{ 
s q r t (2); // sqrt<int>(int) 
sqrt(2.0) ; // sqrt(double) 
sqrt(z) ; // sqrt<double>(complex<double>) 
} 

Я не понимаю, почему SQRT (г); звонки sqrt<double>(complex<double>) может любой корпус объясните пожалуйста.

Автор говорит, T sqrt<complex<T>> более специализированы, чем T sqrt <T> но есть отдельная декларация template<class T > complex<T> sqrt(complex<T>); почему бы не использовать это?

+0

Извините, ребята, я не понял sqrt (комплекс ) представляет собой комплекс sqrt <комплекс > – yesraaj 2008-10-20 10:58:08

ответ

2

Ну, используется функция, о которой вы говорите, sqrt<double>(complex<double>) является экземпляром шаблона template <class T> complex<T> sqrt(complex<T>).

Ваше непонимание было в значении экземпляра шаблона, а не в процессе перегрузки.

6

В ретроспективе, было бы проще, если Бьярня написала бы как

template<class T> T sqrt(T); 
template<class U> complex<U> sqrt(complex<U>); 
double sqrt(double); 
void f(complex<double> z) 
{ 
    sqrt (2); // sqrt<int>(int) 
    sqrt(2.0) ; // sqrt(double) 
    sqrt(z) ; // sqrt<double>(complex<double>) 
} 

так что вы не запутаться все различные T. Но идея проста; C++ находит лучшее совпадение. Возможны три функции. Первые два являются идеальными совпадениями (без необходимости преобразования), поэтому версия без шаблонов игнорируется. Теперь имеем T = complex и U = double. Какая версия выбрана? Бьярне объясняет, что здесь выбран второй шаблон, потому что он более специализирован. Это означает, что для любого типа U существует тип T=complex<U>, который делает сигнатуры обоих шаблонов одинаковыми.

Смежные вопросы