【问题标题】:ill-formed template partial specialization病态模板偏特化
【发布时间】:2021-12-10 21:30:01
【问题描述】:

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

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++ templates language-lawyer template-specialization


【解决方案1】:
template <typename T>
struct Y<typename X<T>::type> {};

不比主要类模板更专业。

template <typename T>
struct Y {};

换句话说,它接受主要类模板接受的同一组类型,而不是它的子集。 The exact clause from the specification.

编辑:

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

【讨论】:

  • 您如何认为它没有比主模板更专业?及其定义:using type = T;?如果是这样using type = T&amp;; 也会失败...
  • 我的代码格式错误,因为它没有比主模板更专业,而您的代码将失败,因为typename X&lt;T&gt;::type 在这种情况下是不可推导的。不要误会我的意思,我的部分特化也使用了不可推导的类型,但由于无法匹配,编译器无法使用它,必须依赖主模板。因此,对于using type = T,代码格式错误,因为部分特化并不比主模板更专业;对于using type = T&amp;,代码格式错误,因为type 是不可推导的类型。跨度>
  • @Mechap 在这两种情况下,您的代码都是不正确的,因为专业化参数不可推导出。
  • 它不也不是格式错误的,因为它没有比主模板更专业吗?
  • @Mechap - “更专业”不是一些手摇术语。它是根据涉及主要和专业化之间的模板参数推导的过程来定义的。如果不能推导出论点,则关系不成立。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
相关资源
最近更新 更多