関数テンプレートのオーバーロードを研究するために、私は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関数は両方とも実行可能な関数であり、変換のランクは同じです(非定数から定数、配列からポインター)。この場合、テンプレート関数はから削除する必要があります。実行可能な関数のセット。
誰か教えてもらえますか?私の質問を検討していただきありがとうございます!