2
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的 The C++ Programming Language。第 13.3.2 节

4

1 回答 1

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>)

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

于 2012-10-18T07:13:59.117 回答