2016-01-20 25 views
1

考慮沒有得到模板專業化和預期不確定性重載C++

Class Wow{ 
    public: 
     //main metod 
     template<typename T> 
     void foo(T t){ 
      cout << t << endl; 
     } 

     template<> 
     void foo<int>(int t){ 
      cout << "specialization" << endl; 
     } 

     void foo(int t){ 
      cout << "overloading" << endl; 
     } 
} 

和主要是

Wow wow; 
wow.foo(2.2); 
wow.foo(1); 

這個輸出

2.2 
overloading 

我的問題是爲什麼,即使編譯?實際上,,foo被定義爲void foo(int)兩次。

1)爲什麼通過?

2)爲什麼編譯器選擇重載?

謝謝

+0

重載總是被視爲比模板實例更好的匹配。即使模板實例是明確的專業化。如果我有一個標準的副本,我會引用它。 – StoryTeller

+0

答案2)。但爲什麼它讓歧義通過? – Gulzar

+0

因爲如果一個更好的匹配,沒有歧義。模糊性是編譯器沒有可以決定調用其中一個的規則。 – StoryTeller

回答

1

1)因爲這裏沒有問題。有模板功能,功能模板專業化和重載。你可以調用模板特這樣的:

wow.foo<int>(3); 

2)過載有更好的匹配,比模板專業化,如果編譯器可以調用這個函數與ARG。

n4926 13.3.3/1.7

根據這些定義,一個可行的函數F1被定義爲比另一個可行函數F2一 更好的功能,如果對所有的參數 我,ICSI(F1)是不更糟糕的轉換序列比ICSI(F2),和 然後

F1不是函數模板專業化和F2是一個函數 模板特