在C中,std::enable_if用于模板参数中的条件类型选择。当使用较新的语法 typename std::enable_if_t<...> 时代替 typename std::enable_if<...>::type*,编译器可能会引发重新定义错误。
要理解原因,请考虑以下代码:
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() { }
This代码声明了两个模板,根据 T 是 int 还是 double 来重载 f。但是,当代码更新为使用 std::enable_if_t 时,会导致重新定义错误:
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() { }
错误的原因是,即使第二个模板参数的默认值不同,模板仍然是相同的类型,template
要解决此问题,请删除模板参数中的enable_if 子句并将 typename 替换为 class:
template<class T, class U /* = std::enable_if_t<std::is_same<int, T>::value> */> void g() { } template<class T, class U /* = std::enable_if_t<std::is_same<double, T>::value> */> void g() { }
或者,您可以为第二个模板参数指定不同的类型:
template<class T, std::enable_if_t<std::is_same<int, T>::value, int> = nullptr> void g() { } template<class T, std::enable_if_t<std::is_same<double, T>::value, int> = nullptr> void g() { }
以上是为什么在模板参数中使用'enable_if_t”会导致重新定义错误?的详细内容。更多信息请关注PHP中文网其他相关文章!