Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++11启用_if error-模板参数重新声明_C++_Templates_C++11_Stl_Enable If - Fatal编程技术网

c++11启用_if error-模板参数重新声明

c++11启用_if error-模板参数重新声明,c++,templates,c++11,stl,enable-if,C++,Templates,C++11,Stl,Enable If,我正在尝试编译以下代码: 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

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

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参数,并根据trait是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>
{
};

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

方便地说,您的用例不需要SFINAE:类模板支持部分专门化。您只需使用一个默认的bool参数,并根据trait是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>
{
};

您需要显示更多的代码。不清楚什么是主模板,什么是/是专门化,也不清楚这意味着什么:typename std::enable_if::type=0类型何时以及为什么会等于零?通常我认为答案是“决不”。@ChrisBeck在他的例子中,type是int的别名,int可以是一个非类型模板参数,可以有一个默认值,如0。这实际上是从重载解析中删除函数的一种方法,因为当std::enable_if的条件为false时,就不会出现类型别名和SFINAE。我知道了,我以前从未见过这种情况。更常见的是看到typename ENABLE=typename std::ENABLE\u if::type@ChrisBeck和@user2296177。谢谢你抽出时间来看看我的问题。迪特玛·库尔提供了一个解决我问题的方案。谢谢你的帮助。你需要显示更多的代码。不清楚什么是主模板,什么是/是专门化,也不清楚这意味着什么:typename std::enable_if::type=0类型何时以及为什么会等于零?通常我认为答案是“决不”。@ChrisBeck在他的例子中,type是int的别名,int可以是一个非类型模板参数,可以有一个默认值,如0。这实际上是从重载解析中删除函数的一种方法,因为当std::enable_if的条件为false时,就不会出现类型别名和SFINAE。我知道了,我以前从未见过这种情况。更常见的是看到typename ENABLE=typename std::ENABLE\u if::type@ChrisBeck和@user2296177。谢谢你抽出时间来看看我的问题。迪特玛·库尔提供了一个解决我问题的方案。谢谢你的帮助。这对我很有效。这确实是一个非常优雅的解决方案。非常感谢你的帮助。这对我非常有效。这确实是一个非常优雅的解决方案。非常感谢你的帮助。