2016-05-24 87 views
0

我有一個名爲function例如具有以下簽名的簡單功能:無法推斷出模板參數的重載函數

class Type { /* ... */ }; 

bool function(const Type& aValue) { /* ... */ return true; } 

我有一些其他類,我想超載提到的功能,所以只有從Base派生的類可以使用它:

class Base { /* ... */ }; 
class Derived : public Base { /* ... */ }; 

template < typename T > 
bool function(const typename std::enable_if< std::is_base_of< Base, T >::value, T >::type& aValue) { /* ... */ return true; } 

這是工作的罰款,如果我用這樣的:

Derived object; 
function<Derived>(object); 

但是如果我離開這個模板參數我得到的提到的錯誤(無法推斷出模板參數):

Derived object; 
function(object); // Compilation error (C2664). 

是否有任何解決方案,我可以離開模板參數?

(MSVC 2012)

+0

Isnt T在非推論的上下文中:'std :: is_base_of < Base, T > :: value'?看到這裏參考http://stackoverflow.com/questions/25245453/what-is-a-nondeduced-context – marcinj

+0

這不是一個編譯器問題。 T不能從這裏推導出來,因此沒有編譯器會成功 –

回答

4

通過引入嵌套名指定中(<T>::)你抑制對T模板類型推演。

這就是說,你必須讓參數表達式類型通過將enable_if其他地方,例如,在返回類型的語法可以推斷:

template <typename T> 
auto function(const T& aValue) 
    -> typename std::enable_if<std::is_base_of<Base, T>::value, bool>::type 
{ 
    return true; 
} 

或模板類型參數列表:

template <typename T, typename = typename std::enable_if<std::is_base_of<Base, T>::value>::type> 
bool function(const T& aValue) 
{ 
    return true; 
} 
+0

第二種解決方案我得到這個錯誤: '錯誤C4519:默認模板參數只允許在類模板上用於函數定義。對於函數調用:'error C2664:'function':不能將參數1從'Derived'轉換爲'const Type&'' –

+0

@ p.i.g。您使用的MSVC不支持此C++ 11功能 –

+0

是否有任何解決方法? –