c ++ 11 enable_if错误 - 模板参数重新声明

时间:2016-06-30 03:36:28

标签: c++ templates c++11 stl enable-if

我正在尝试编译以下代码:

var

编译时出现以下错误:

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

这里的目的是选择Calc的版本,如果传递的模板参数是类,则覆盖基类函数调用操作符。如果传递的参数是基本类型,那么我们选择不覆盖基类功能的Calc版本。 能否请你帮我理解我是如何让这个工作的?

1 个答案:

答案 0 :(得分:6)

我认为类模板声明不适用于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>
{
};