1

2 つのオーバーロードされた関数テンプレートを取得しました。

template <class typ1, class typ2>
void szab(typ1, typ2) {cout << "2 typy" << endl;}

template <class typ1>
void szab(typ1, typ1) {cout << "1 typ" << endl;}

次のような関数を呼び出すと、あいまいさがなくなるのはなぜszab(1, 1);ですか? 2 番目のテンプレートは最初のテンプレートの特別バージョンではありませんか? テンプレートで 2 つのパラメーターを宣言する場合、それらが異なる型である必要があるという意味ではなく、異なる型である可能性があります。コンパイラが 2 番目のテンプレートを選択するのはなぜですか?

4

1 に答える 1

4

2 つ目は「より特殊化されたテンプレート」であり、「置換」が少なくて済み、コンパイラはオーバーロード解決フェーズで最適な選択としてそれを選択します。

§14.5.6.2 (関数テンプレートの部分的な順序付け):

部分的な順序付けでは、各テンプレートを順番に変換し (次の段落を参照)、関数の型を使用してテンプレート引数推定を実行することにより、2 つの関数テンプレートのどちらが他方よりも特殊化されているかを選択します。推定プロセスは、テンプレートの 1 つが他のテンプレートよりも特化されているかどうかを判断します。その場合、より特殊化されたテンプレートが部分順序付けプロセスによって選択されます。

于 2013-10-21T20:20:31.960 に答える