c ++模板函数重载

yes*_*aaj 3 c++ templates

以下是"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>)
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么sqrt(z); 电话sqrt<double>(complex<double>)可以任何机构请解释.

作者说, T sqrt<complex<T>> 比较专业,T sqrt <T>但有一个单独的声明,template<class T > complex<T> sqrt(complex<T>);为什么不使用它?

MSa*_*ers 6

事后来看,如果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>)
}
Run Code Online (Sandbox Code Playgroud)

所以你不要被所有不同的T弄糊涂.但这个想法很简单; C++找到最佳匹配.有三种可能的功能.前两个是完美匹配(不需要转换),因此忽略非模板版本.现在,我们有T = complex和U = double.选择哪个版本?Bjarne解释说这里选择了第二个模板,因为它更专业.这意味着对于任何类型U,存在T=complex<U>使两个模板的签名相同的类型.