1

なぜコンパイラはこれを許可するのですか?

#include <iostream>
using namespace std;

template<typename T>
void func(T t)
{
    cout<<"The value is :"<<t<<"\n";
}

template<>
void func<int>(int d)    //Template Specialization
{
    cout<<"Template function\n";
}

void func(int d)        //Non-template function with same name & signature
{
    cout<<"Non-template function\n";
}

int main()
{
    func(4);
    func(4.67);
    func("TENE");
}
4

2 に答える 2

3

このコードは完全に合法だからです。解決ルールについては、この記事を参照してください。

于 2012-04-23T09:51:39.580 に答える
3

質問に対する答えは、セクション 13.3.3 にあります。

これらの定義が与えられた場合、実行可能な関数 F1 は、すべての引数 i について、ICSi(F1) が ICSi(F2) よりも悪い変換シーケンスではない場合、別の実行可能な関数 F2 よりも優れた関数であると定義されます。

— 一部の引数 j に対して、ICSj(F1) は ICSj(F2) よりも優れた変換シーケンスです。そうでない場合は、

— F1 は非テンプレート関数で、F2 は関数テンプレートの特殊化です。そうでない場合は、

— F1 と F2 は関数テンプレートの特殊化であり、F1 の関数テンプレートは、14.5.5.2 で説明されている半順序規則に従って、F2 のテンプレートよりも特殊化されています。そうでない場合は ...

したがって、3 つの選択肢 (非テンプレートfunc、特殊化func<int>、汎用テンプレートfunc<typename T>) の中で、非テンプレート バージョンがfunc最適です。ここには完全に一致するため、コンパイラがテンプレート バージョンに目を向ける理由はありません。関数の。

于 2012-04-23T10:12:52.507 に答える