2016-07-18 6 views
4

を理解し、私はこれと同じタイトルでいくつかのスレッドを閲覧しましたが、私はこれを理解役立っている何かを見つけることができません...関数テンプレートのオーバーロード:Stroustrup氏の例が

次はのスキャンであります「The C++ Programming Language」第2版、B Stroustrup、13.3.2項(336ページ)の例はほとんどありません。

enter image description here

私は第三sqrt(z)オーバーロードの解決を理解していません。私は決議がsqrt<complex<double>>(complex<double>)になると思った。

Obv関数double sqrt(double)が請求書に適合しません。しかし、私はtemplate<class T>T sqrt(T)sqrt<double>(complex<double>)に解決できないと考えていました。Tは2つの異なる解像度を持っていると思います。Tは「スコープ」全体で同じものでなければなりません。

私は誤解したことがありますか?それを指摘できますか? :)ありがとう!

+0

declをよく見てください。テンプレート引数( 'T')の型とパラメータの型(' complex ')の間に違いがあります。後者は前者から 'T'を引きます。したがって、彼の記法は正しい。または。 。私はあなたの質問を完全に誤解していました。 – WhozCraig

答えて

4

2つ目は、通話に適した仕様です。パラメータは、関数が

sqrt<double> 

は、コンパイラが最もspeciallizedテンプレート機能を選択することを忘れないでくださいある、つまり、

complex<T> 

でタイプTです。

+0

ああ、それはペニードロップを作った、ありがとう! – Jimbo

3

この場合、あなたが見つけたように、署名をテンプレートに一致させる方法は2つあります。最初のテンプレートtemplate<class T> T sqrt(T)は一致する可能性があります。 Tcomplex<double>とすると、署名がcomplex<double> sqrt(complex<double>)の関数(テンプレート特殊化)が作成されます。

第2のテンプレートtemplate<class T> complex<T> sqrt(complex<T>)も一致させることができます。この場合、Tからdoubleに設定すると、最初のテンプレートの特殊化と同じシグネチャで特殊化されます。

テンプレートオーバーロードの解像度は、より特殊なテンプレートを選択します。この場合は、complex<T>でのみ動作します。それはそれが簡単に理解するのに役立ちます場合は、2番目のテンプレートで何か他のものにTの名前を変更することがありますテンプレートは似ています:

template<class T> T sqrt(T); 
template<class U> complex<U> sqrt(complex<U>); 

この方法で、それはテンプレートパラメータが二つに無関係であることを確認するために簡単になりました関数テンプレート。 complex<double>は、Tの適切な選択、またはUの適切な選択のいずれかによって取得することができ、2番目のテンプレートはより特殊化されています。

+0

おかげでダン、これも助けました:)私はそれが私のためにペニードロップを作ったように、いくつかの点でそれほど徹底的ではありませんが、私はアントニオの答えを受け入れました。 – Jimbo

関連する問題