首页 > 后端开发 > C++ > 正文

为什么在模板参数中使用 std::enable_if_t 时会出现重新定义错误?

Patricia Arquette
发布: 2024-11-27 02:23:14
原创
954 人浏览过

Why do I get redefinition errors when using std::enable_if_t in template arguments?

模板参数中 std::enable_if_t 的异常重定义错误

在 C 中,std::enable_if 是一个元函数,允许基于某些约束条件启用模板。它最近被更简洁的 std::enable_if_t 取代。但是,当尝试移植现有代码以使用新语法时,一些用户会遇到意外的重新定义错误。

示例代码

考虑使用 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() { }
登录后复制

此代码成功编译,具有 int 和 double 的单独特化。现在,假设我们想使用 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() { }
登录后复制

意外错误

与预期相反,此更新的代码无法编译,与海湾合作委员会 5.2 reporting:

error: redefinition of 'template<class T, class> void g()'
       void g() { }
登录后复制

解释

错误在于 std::enable_if_t 表示类型,而不是条件。当用作模板参数时,它指定类型约束。在原始 std::enable_if 情况下,第二个模板参数是指针类型,而在 std::enable_if_t 版本中,它成为类型别名。这会产生两个具有相同类型 (void()) 的不同模板参数。

解决方案

为了避免这种歧义,我们需要确保第二个模板参数表示唯一类型约束。实现此目的的一种方法是使用虚拟模板参数:

template<typename T,
         typename U = std::enable_if_t<std::is_same<int, T>::value>>
void g() { }

template<typename T,
         typename U = std::enable_if_t<std::is_same<double, T>::value>>
void g() { }
登录后复制

在这种情况下,U 是一个虚拟参数,仅用于区分两个模板参数。经过此修改,代码将成功编译。

以上是为什么在模板参数中使用 std::enable_if_t 时会出现重新定义错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板