2008-10-20 128 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>,這使得兩個模板的簽名都相同。