以下是"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>);为什么不使用它?
事后来看,如果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>使两个模板的签名相同的类型.
| 归档时间: |
|
| 查看次数: |
3440 次 |
| 最近记录: |