簡體   English   中英

C ++模板函數重載

[英]c++ template function overloading

下面是“ 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(z); 調用sqrt<double>(complex<double>)可以解釋任何主體。

作者說, T sqrt<complex<T>>T sqrt <T>更專業,但是template<class T > complex<T> sqrt(complex<T>);有一個單獨的聲明template<class T > complex<T> sqrt(complex<T>); 為什么不使用它?

事后看來,如果Bjarne將其寫為

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>使兩個模板的簽名相同。

好吧,所使用的函數是您正在談論的函數sqrt<double>(complex<double>)是模板template <class T> complex<T> sqrt(complex<T>)的實例。

您的誤解是模板實例的含義,而不是重載過程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM