簡體   English   中英

c ++ 11 enable_if錯誤-模板參數重新聲明

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM