我正在尝试编译以下代码:
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版本。 能否请你帮我理解我是如何让这个工作的?
答案 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>
{
};