在模板参数推导中sqrt <t>(complex <t>)matche sqrt <t>(<t>)函数调用如何?</t> </t> </t> </t>

时间:2012-10-18 07:05:13

标签: c++ templates arguments template-deduction

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节

1 个答案:

答案 0 :(得分:7)

好吧,z的类型为complex<double>。如果Tdouble则显然匹配

template <typename T> complex<T> sqrt(complex<T>);

此外,Tcomplex<double>相匹配

template <typename T> T sqrt(T);

这有什么问题?

作为匹配这两个函数的结果,用于决定使用哪个函数的重载集包含两个实例

complex<double> sqrt<double>(complex<double>)
complex<double> sqrt<complex<double>>(complex<double>)

两者都匹配,但第一个更专业,因此,由重载决议选择。