2013-11-02 16 views
4

我有兩個功能,如下面的C++模板比int-> unsigned轉換更好嗎?

template<typename T> 
unsigned int myFunction(T myelement) 
{ 

myelement->func(); 

return 2; 
} 

void myFunction(unsigned int myelement) 
{ 
} 

,我用下面的代碼

myFunction(2); 

的Visual Studio 2012是抱怨 「INT還沒有 - > FUNC()」。爲什麼不使用unsigned int版本?

+0

我覺得你的代碼寫的不好,不易閱讀;我不會推薦這樣的代碼,但這是一個意見和口味的問題。 –

+2

簡短回答:是的,一個用參數完全匹配實例化的函數模板比​​帶有標準轉換的非模板函數要好。因此,例如C++允許'std :: pow'的「通配符」版本是一個模板(http://en.cppreference.com/w/cpp/numeric/math/pow)。如果重載1-3總是比模板匹配得更好,這是沒有意義的。 –

回答

3

您誤讀錯誤消息的類型。編譯器不會使用該函數,它正在實例化它,以確定它是否是候選者。你需要禁用實例非適合類型:

template<typename T> 
typename std::enable_if<!std::is_fundamental<T>::value, unsigned int >::type 
myFunction(T myelement) 
{ 
    // ... 
} 

Live example

1

嘗試編碼

myFunction(2U); 

myFunction((unsigned)2); 

字面2int(未unsigned int)型。而int不是一個類或具有->func()

也許specialize the templateunsigned,而不是定義myFunction(unsigned int)