2012-12-06 57 views
3

我只是一個簡單的問題,檢查這個代碼,請:模板專業化和普通的舊功能

template < typename A > 
void foo(A a) 
{ cout<<"1\n"; }; 

template< > 
void foo<float>(float a) 
{ cout<<"2\n"; } 

void foo(float a) 
{ cout<<"3\n"; } 


int main() 
{ 
    foo<float>(1.0f); 
} 

編譯使用g ++ 4.7.2作品,當然,但什麼是我不明白就是爲什麼輸出「2」而不是「3」。

據我記得,一個非模板函數應該總是偏向一個模板,所以爲什麼叫做專用foo?

謝謝

+1

您需要調用'foo(1.0f)'來獲取非模板。 – juanchopanza

+0

'foo '是一個模板函數專門化的名稱(你碰巧明確地專門化了;如果你沒有,你會看到「1」)。如果你沒有提供'<...>'語法,重載解析確實會更喜歡非模板函數。 –

+0

這不違反ODR嗎? – jrok

回答

8

您特別使用專門的版本。你是否這樣做:

template <typename T> 
void foo(T a) { 
    std::cout << "1" << std::endl; 
} 

void foo(float a) { 
    std::cout << "2" << std::endl; 
} 
int main(void) { 
    foo(1.0f); 
} 

比它會選擇非模板版本。

+0

我很抱歉..這是對的..責備我.. – fjanisze