2008-10-20 183 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>) 
} 

我不明白为什么开方(Z)线;请致电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。选择哪个版本? Bjarne解释说第二个模板是在这里选择的,因为它更专业。这意味着对于任何类型的U,都有一个类型为T=complex<U>,这使得两个模板的签名都相同。