3

関数テンプレートのオーバーロードを研究するために、私は2つの関数を作成しました。

template <typename T>
void pe16_61_compare(const T&, const T&) {
    cout <<"template pe16_61_compare(T, T) called" << endl;
}

// plain functions to handle C-style character strings
void pe16_61_compare(const char*, const char*) {
    cout <<"normal func pe16_61_compare(...) called" << endl;;
}

次に、いくつかの変数を定義して、関数pe16_61_compareを呼び出しました。

const char const_arr1[] = "world", const_arr2[] = "hi";
char ch_arr1[] = "world";
// first call
pe16_61_compare(ch_arr1, const_arr1);
// second call
pe16_61_compare(const_arr1, const_arr2);

出力結果は次のとおりです。

template pe16_61_compare(T, T) called
normal func pe16_61_compare(...) called

私を混乱させるのは、最初の呼び出しがテンプレート関数を呼び出すことです。私にとって、最初の呼び出しでは、2つのpe16_61_compare関数は両方とも実行可能な関数であり、変換のランクは同じです(非定数から定数、配列からポインター)。この場合、テンプレート関数はから削除する必要があります。実行可能な関数のセット。

誰か教えてもらえますか?私の質問を検討していただきありがとうございます!

4

1 に答える 1

3

最初の呼び出しでT = char[6]は、への変換よりも一致が優れているchar const *ため、テンプレートが優先されます。

2番目の呼び出しでは、単一のテンプレートパラメータは配列に対して機能できないため、一致するのは非テンプレートオーバーロードのみです。

あなたが言うなら、

pe16_61_compare(static_cast<char const *>(const_arr_1),
                static_cast<char const *>(const_arr_2));

その場合、テンプレートインスタンスと通常の関数の両方が実行可能であり、同じシグネチャを持ちますが、タイブレーカーとして非テンプレート関数が優先されます(つまり、これはあいまいではありません)。

于 2012-11-25T20:12:36.503 に答える