Templates 为什么模板参数的部分专业化不起作用?

Templates 为什么模板参数的部分专业化不起作用?,templates,c++14,partial-specialization,Templates,C++14,Partial Specialization,我正在考虑Class1、Class2、Class3 Class2和Class3与int有部分专业化,因此它们的定义相同 另一方面,Class1专门用于Class3和只有一个参数的通用模板,即一元。所以Class1对Class2没有专业化 碰巧Class1::type实际上是Class3。事实上,我明确地写下了专业化。但是,编译器说Class1::type它没有定义。但是我为模板案例定义了专业化,Class1。为什么编译器不能识别它?如何让编译器选择最专业的案例(Class1::type),如果存

我正在考虑
Class1、Class2、Class3

Class2
Class3
int
有部分专业化,因此它们的定义相同

另一方面,
Class1
专门用于
Class3
和只有一个参数的通用模板,即
一元
。所以
Class1
Class2
没有专业化

碰巧
Class1::type
实际上是
Class3
。事实上,我明确地写下了专业化。但是,编译器说
Class1::type
它没有定义。但是我为模板案例定义了专业化,
Class1
。为什么编译器不能识别它?如何让编译器选择最专业的案例(
Class1::type
),如果存在,如果没有,如何让编译器选择模板案例(
Class1
)?多谢各位

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>;
};
模板
一级;
模板
二级;
模板
三班;
模板
二级
{};
模板
三班
{};
模板
一班
{
公众:
使用类型=类别3;
};
模板
一班
{
公众:
使用类型=一元;
};

在C++17之前,此类模板:

template<template<class> class Unary, typename T>
class Class1<Unary<T>>
模板
一班

不应使用可变模板。对于具有默认参数的模板也是如此(例如,请使用
std::vector
检查)-。这是standard中的一个缺陷,C++17中的修复是有趣的:将gcc和clang与vs中的一元模板参数进行比较。两个编译器都做前者,但clang拒绝后者(而gcc接受后者)。我猜你在用叮当声?(两人都很高兴给出一个可变模板来推导可变模板参数:)我不明白你的问题。您知道“Class1没有针对Class2的专门化”,因为一元专门化与“只有一个参数的模板模板”相关,但您感到惊讶的是,“然而,编译器说Class1::type它没有定义。但是我为模板案例Class1定义了专门化”@MaxLanghof-观察到两个编译器都失败,后者(也是gcc)使用C++14而不是C++17编译。语言在C++17中发生了变化,因此我怀疑g++是一致的,而clang++不是。@max66它可以归结为“您能将可变模板作为一元模板参数传递吗?”。根据3个主要编译器的投票结果,答案似乎是“在C++14中你不能,在C++17中你可以”。但这就是问题。相关问题: