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>です。でTあるdoubleと明らかに一致する

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

また、Tあるcomplex<double>と一致する

template <typename T> T sqrt(T);

これのどこに問題がありますか?

これらの関数の両方を一致させた結果、どちらの関数を使用するかを決定するためのオーバーロード セットは、2 つのインスタンス化で構成されます。

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

どちらも一致しますが、最初のものはより専門的であるため、オーバーロードの解決によって選択されます。

于 2012-10-18T07:13:59.117 に答える