【发布时间】:2015-10-08 15:03:00
【问题描述】:
我有以下使用 std::enable_if 的案例:
template<typename T,
typename std::enable_if<std::is_same<int, T>::value>::type* = nullptr>
void f() { }
template<typename T,
typename std::enable_if<std::is_same<double, T>::value>::type* = nullptr>
void f() { }
现在,我在 cppreference 中看到了新语法,在我看来更简洁:typename = std::enable_if_t<std::is_same<int, T>::value>>
我想移植我的代码:
template<typename T,
typename = std::enable_if_t<std::is_same<int, T>::value>>
void g() { }
template<typename T,
typename = std::enable_if_t<std::is_same<double, T>::value>>
void g() { }
但现在 GCC (5.2) 抱怨:
error: redefinition of 'template<class T, class> void g()'
void g() { }
为什么会这样?如果可能的话,在这种情况下,我能做些什么来获得新的、更简洁的语法?
【问题讨论】:
-
您的第二个代码使用默认模板参数。它们不是函数签名的一部分,因此您要声明两个具有相同签名 = 重新定义的函数模板。
enable_if_t的对应用法就是std::enable_if_t<std::is_same<int, T>::value>* = nullptr。 -
嗯,你没有完全重写你的原始代码。你忘了
* = nullptr。 -
您可以在其中一个声明中添加一个虚拟模板参数,例如
, typename = void在enable_if之后 -
@dyp:我认为您可以将您的评论作为答案! @KerrekSB:不,这就是
enable_if_t@PiotrS 的意义所在。 : 好的 -
@Jean-MichaëlCelerier 你不需要
typename前面的std::enable_if_t。获得更多角色。
标签: c++ templates c++14 sfinae enable-if