我正在考虑Class1, Class2, Class3
。
Class2
和Class3
具有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>;
};
答案 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