template<class T> T sqrt (T);
template<class T> complex<T> sqrt(complex<T>);
double sqrt(double);
void f(complex<double> z)
{
sqrt(z);
}
在此代码中,sqrt<double>(complex<double>)
如何最终成为候选者
模板参数演绎?
作者说,与sqrt<T>(complex<T>)
匹配的任何电话也与sqrt<T>(<T>)
匹配。怎么样?
代码来自Bjarne Stroustrup的 C ++编程语言。第13.3.2节
答案 0 :(得分:7)
好吧,z
的类型为complex<double>
。如果T
为double
则显然匹配
template <typename T> complex<T> sqrt(complex<T>);
此外,T
与complex<double>
相匹配
template <typename T> T sqrt(T);
这有什么问题?
作为匹配这两个函数的结果,用于决定使用哪个函数的重载集包含两个实例
complex<double> sqrt<double>(complex<double>)
complex<double> sqrt<complex<double>>(complex<double>)
两者都匹配,但第一个更专业,因此,由重载决议选择。