[英]c++11 enable_if error - template parameter re-declaration
我正在嘗試獲取以下代碼進行編譯:
template <class T, typename std::enable_if<!std::is_fundamental<T>::value, int >::type = 0 >
class Calc
{
public:
int operator()( const T& v ) const {
return v.getValue();
}
};
template <class T, typename std::enable_if<std::is_fundamental<T>::value, int >::type = 0 >
class Calc : CalcBase <T>
{
};
編譯時出現以下錯誤:
c.cpp:26: error: template parameter 'typename std::enable_if<(! std::is_fundamental::value), int>::type <anonymous>'
c.cpp:36: error: redeclared here as 'typename std::enable_if<std::is_fundamental::value, int>::type <anonymous>'
如果傳遞的模板參數是一個類,則此處的目的是選擇Calc的版本,該版本將覆蓋基類函數調用運算符。 如果傳遞的參數是基本類型,則我們選擇不覆蓋基類功能的Calc版本。 您能幫我了解如何使它工作嗎?
我認為類模板聲明不能與SFINAE一起使用:類模板不會像函數模板那樣重載。 您要聲明兩個名稱相同的主類模板,這是不允許的。
方便地,您的用例不需要SFINAE:類模板支持部分專業化。 您只需使用默認的bool
參數,並根據特征是true
還是false
專門化類模板。 例如:
template <class T, bool = std::is_fundamental<T>::value>
class Calc
{
public:
int operator()( const T& v ) const {
return v.getValue();
}
};
template <class T>
class Calc<T, false> : CalcBase <T>
{
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.