c++ - 病态模板偏特化
问题描述
我正在尝试模板部分专业化,我已经找到了以下代码。
template <typename T>
struct X {
using type = T;
};
template <typename T>
struct Y {};
template <typename T>
struct Y<typename X<T>::type> {};
Clang、GCC 和 MSVC 似乎抱怨模板参数在这种情况下是不可推导出的。但是,不应该匹配部分专业化。因此,每个专业化都将依赖于主模板定义。
我在规范中找不到禁止这样做的部分。
解决方案
template <typename T>
struct Y<typename X<T>::type> {};
不比初级类模板更专业。
template <typename T>
struct Y {};
换句话说,它接受与主类模板接受的相同类型集,而不是它的子集。规范中的确切条款。
编辑:
感谢@Jarod42 在评论中的澄清,该程序格式错误,因为部分专业化中的论点不可推导出,而不是因为它没有更专业化。该程序在实例化时失败X
,而不是在Y
.
推荐阅读
- java - 单独的搜索关键字和方面
- r - 如何获取脚本中的所有对象
- r - R Shiny:如何保存模块的返回值?
- reactjs - 如何将查询参数传递给 lambda 函数内的 url(netlify 环境)
- webots - 如何将代码从 webbot 传输到真正的 e-puck2 机器人?
- dart - 如何将颤振连接到 Bluestacks 模拟器?
- mongodb - 引起:org.bson.BsonInvalidOperationException: Invalid state INITIAL
- java - 如何在泛型方法中修复“错误:二元运算符的错误操作数类型”?
- c# - 如何将某些文本框的值存储在列表框的项目中?没有数据库。,但通过使用数组
- c# - 如何更改库方法签名C#