2016-05-25 86 views
2

我想創建一個完整的類型的部分專業化。我的想法是做類似的東西:爲什麼enable_if不能用於專門的參數?

#include <type_traits> 

template <typename T> 
struct Class { 
}; 

template <typename T> 
struct Class<typename std::enable_if<std::is_integral<T>::value, T>::type> { 
}; 

然而,這會導致以下錯誤:

error: template parameters not deducible in partial specialization: 
struct Class<typename std::enable_if<std::is_integral<T>::value, T>::type> { 
    ^
note: 'T' 

它的工作,如果我使用一個額外的模板參數:

#include <type_traits> 

template <typename T, typename Enable = void> 
struct Class { 
}; 

template <typename T> 
struct Class<T, typename std::enable_if<std::is_integral<T>::value>::type> { 
}; 

爲什麼我需要額外的模板參數嗎?

回答

3

在第一種情況下,你並不是專門研究這個類。 當你寫:

template <typename T> 
struct Class<typename std::enable_if<std::is_integral<T>::value, T>::type> { 
}; 

T是仍然是一個通用的模板類型,和你的編譯器就會犯糊塗。

在第二種情況下,當你寫

template <typename T> 
struct Class<T, typename std::enable_if<std::is_integral<T>::value>::type> { 
}; 

您正確專門的模板參數Enable,一切工作正常。

如果你想專注的第一個,你應該這樣做的類型,這可能不是你想要

template <> 
struct Class<std::enable_if<std::is_integral<int>::value, int>::type> { 
}; 
+0

什麼,但不專業化還決心類類型?我不明白第二種情況對編譯器是如何清楚的。 –

+0

你實際上並不需要'Enable = void',所以不用它,它也應該可以正常工作。 'template '應該訣竅 –

+1

啊!現在我明白了!基本案例是。專業化是類,所以模板參數E現在是專門的。沒有E,編譯器會認爲在行動中沒有部分專業化(專業化與基礎案例類型相同)。感謝您爲此閃亮! –

相關問題