2012-04-23 121 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 2012-04-23 09:58:23

+0

你說得對。編輯評論。 – cppcoder 2012-04-23 10:03:31

+0

也許你可以說出你預期的錯誤,以及爲什麼。 – MSalters 2012-04-23 14:09:32

回答

3

的問題的答案就在於根據這些定義節13.3.3

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

- 對一些參數Ĵ,ICSj(F1)比ICSj(F2)更好的轉換序列,或者,如果不說,

- F1是一個非模板函數,F2是一個函數根據14.5.5.2中描述的偏序排列規則,F1和F2的功能模板比F2的模板更專業化,或者如果不是這樣,F1的功能模板比F2的模板更專業化,或者如果不是,......

所以之間的func<int>的三個選項(非模板func,專業化和通用模板func<typename T>func非模板版本是最好的。由於這裏有一個完美的匹配,所以編譯器沒有理由甚至查看功能的模板版本。

3

因爲這段代碼是完全合法的。有關解決規則,請參見this article

+0

+1非常好的閱讀。整本書也是如此。 – Anonymous 2012-04-23 09:58:49