我有以下使用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
。 - dypenable_if
后面加上, typename = void
。 - Piotr Skotnickistd :: enable_if_t
前面加上typename
。 获得了更多的字符。 - bogdan*=0
而不是*=nullptr
。 - Jean-Michaël Celerier*=0
。我将int
作为enable_if_t
的第二个参数提供,而不是默认的void
,因此0
是一个整数字面量,而不是空指针字面量。 - Oktalist