3

以下は、「c++ プログラミング言語」の行です。

template<class T > T sqrt(T );
template<class T > complex<T> sqrt(complex<T>);
double sqrt(double);
void f(complex<double> z )
{
s q r t (2 ); // sqrt<int>(int)
sqrt(2.0) ; // sqrt(double)
sqrt(z) ; // sqrt<double>(complex<double>)
}

sqrt(z) ; の理由がわかりません。呼び出しsqrt<double>(complex<double>)は誰でもできます。説明してください。

著者によると、 T sqrt<complex<T>> より専門化されていますが、それを使用しない理由についてT sqrt <T>別の宣言がありtemplate<class T > complex<T> sqrt(complex<T>);ますか?

4

2 に答える 2

6

後から考えると、Bjarne が次のように書いた方が簡単だったでしょう。

template<class T> T sqrt(T);
template<class U> complex<U> sqrt(complex<U>);
double sqrt(double);
void f(complex<double> z )
{
    sqrt (2); // sqrt<int>(int)
    sqrt(2.0) ; // sqrt(double)
    sqrt(z) ; // sqrt<double>(complex<double>)
}

さまざまな T に混乱することはありません。しかし、アイデアは単純です。C++ は最適な一致を見つけます。可能な機能は 3 つあります。最初の 2 つは完全に一致する (変換は不要) ため、テンプレート以外のバージョンは無視されます。ここで、T=complex と U=double があります。どのバージョンが選択されていますか? Bjarne は、ここでは 2 番目のテンプレートが選択されていると説明しています。これは、任意のタイプ U について、T=complex<U>両方のテンプレートの署名を同一にするタイプがあることを意味します。

于 2008-10-20T09:55:58.527 に答える
2

さて、使用されている関数は、あなたが話しているものsqrt<double>(complex<double>)であり、テンプレートのインスタンスですtemplate <class T> complex<T> sqrt(complex<T>)

あなたの誤解は、オーバーロード プロセスではなく、テンプレート インスタンスの意味にありました。

于 2008-10-20T09:47:13.863 に答える