首页 >后端开发 >C++ >为什么在模板参数中使用'enable_if_t”会导致重新定义错误?

为什么在模板参数中使用'enable_if_t”会导致重新定义错误?

Linda Hamilton
Linda Hamilton原创
2024-11-12 10:08:02334浏览

Why Does Using `enable_if_t` in Template Arguments Lead to Redefinition Errors?

为什么模板参数中的enable_if_t会导致重定义错误

在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() { }

错误的原因是,即使第二个模板参数的默认值不同,模板仍然是相同的类型,templatevoid()。这相当于有两个函数 print(string, int) 具有不同的默认 int 值,这对于重载是无效的。

要解决此问题,请删除模板参数中的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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn