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>'

此处的目的是 select 如果传递的模板参数是 class,则覆盖基础 class 函数调用运算符的 Calc 版本。如果传递的参数是基本类型,那么我们选择不覆盖基本 class 功能的 Calc 版本。 能否请您帮助我了解如何使它正常工作?

我认为 class 模板声明不适用于 SFINAE:class 模板不像函数模板那样重载。您正在声明两个主 class 同名模板,这是不允许的。

方便的是,您的用例不需要 SFINAE:class 模板支持部分专业化。您只需使用默认的 bool 参数并根据特征是 true 还是 false 来专门化 class 模板。例如:

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>
{
};