首页 > 解决方案 > 病态模板偏特化

问题描述

我正在尝试模板部分专业化,我已经找到了以下代码。

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 似乎抱怨模板参数在这种情况下是不可推导出的。但是,不应该匹配部分专业化。因此,每个专业化都将依赖于主模板定义。


我在规范中找不到禁止这样做的部分。

标签: c++templateslanguage-lawyertemplate-specialization

解决方案


template <typename T>
struct Y<typename X<T>::type> {};

不比初级类模板更专业。

template <typename T>
struct Y {};

换句话说,它接受与主类模板接受的相同类型集,而不是它的子集。规范中的确切条款。

编辑:

感谢@Jarod42 在评论中的澄清,该程序格式错误,因为部分专业化中的论点不可推导出,而不是因为它没有更专业化。该程序在实例化时失败X,而不是在Y.


推荐阅读