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>)
, Как?
Код от Язык программирования C ++, Бьярн Страуструп. Раздел 13.3.2
Что ж, 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>)
Оба соответствуют, но первый более специализирован и, таким образом, выбирается разрешением перегрузки.
Других решений пока нет …