При выводе аргументов шаблона как вызывается функция sqrt & lt; T & gt; (complex & lt; T & gt;) matche sqrt & lt; T & gt; (& lt; T & gt;)?

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

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

Оба соответствуют, но первый более специализирован и, таким образом, выбирается разрешением перегрузки.

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]