2012-04-23 8 views
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"); 
} 
+0

は '' template <>です。void func (int d) ''部分的な特殊化?部分的なものは ''テンプレートのように見えるでしょう void func (int d) ''、いいえ? '' <> ''では、型を完全に '' int''として定義しています。 – fogbit

+0

あなたは正しいです。コメントを編集しました。 – cppcoder

+0

おそらく、どのエラーが予想されたのか、その理由を記述することができます。 – MSalters

答えて

3

質問への答えは、セクション13.3.3これらの定義を考えると

にあり、実行可能な機能F1が良く関数であると定義されている場合、私は、ICSI (F1)は、ICSI(F2)よりも悪い変換シーケンスではなく、その後

- いくつかの引数jについて、ICSj(F1)は、その

ICSj(F2)よりも良好な変換シーケンスであるか、または、そうでない場合

- F1は非テンプレート関数であり、F2はfuncですF2テンプレートの特殊化は、14.5.5.2で説明した部分順序付け規則に従ってF2のテンプレートよりもF1の関数テンプレートが特殊化されているか、または、それは、...

だから3つの選択肢(非テンプレートfuncfunc<int>の専門、および汎用テンプレートfunc<typename T>の中で、funcの非テンプレートバージョンが最善である場合ではありません。ここで完全に一致するので、コンパイラがテンプレート版の関数を調べる理由はありません。

3

このコードは完全に正当なものです。解決ルールについては、this articleを参照してください。すべての引数のための別の実行可能な関数F2より

+0

+1よく読んでください。全書籍も。 – Anonymous

関連する問題