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。谢谢你抽出时间来看看我的问题。迪特玛·库尔提供了一个解决我问题的方案。谢谢你的帮助。这对我很有效。这确实是一个非常优雅的解决方案。非常感谢你的帮助。这对我非常有效。这确实是一个非常优雅的解决方案。非常感谢你的帮助。