为什么模板模板参数的部分专业化无效?

时间:2019-10-17 11:49:13

标签: templates c++14 partial-specialization

我正在考虑Class1, Class2, Class3

Class2Class3具有int的部分专业知识,因此它们的定义相同。

另一方面,Class1具有Class3<T>的专门化和仅具有一个自变量即Unary<T>的常规模板模板的特长。因此,Class1没有Class2<T>的专业化。

碰巧Class1 <Class3<T>>::type实际上是Class3<T>。确实,我明确地写了专业。但是,编译器说Class1 <Class2<T>>::type未定义。但是我为模板模板案例Class1<Unary<T>>定义了专业化。为什么编译器无法识别它?如果存在,如何使编译器选择最特殊的情况(Class1 <Class3<T>>::type),如果不存在,如何选择模板模板的情况(Class1<Unary<T>>)?谢谢

template<typename...T>
class Class1;

template<typename...T>
class Class2;

template<typename...T>
class Class3;

template<>
class Class2<int>
{};

template<>
class Class3<int>
{};

template<typename T>
class Class1<Class3<T>>
{
 public:
  using type=Class3<T>;
};

template<template<class> class Unary, typename T>
class Class1<Unary<T>>
{
 public:
  using type=Unary<T>;
};

1 个答案:

答案 0 :(得分:1)

在C ++ 17这样的模板之前:

template<template<class> class Unary, typename T>
class Class1<Unary<T>>

不应使用可变参数模板。带有默认参数的模板也是如此(例如,使用std::vector进行检查)-Template template parameter and default values。这是标准中的缺陷,修复程序来自C ++ 17