Почему частичная специализация аргумента шаблона шаблона не работает? - PullRequest
2 голосов
/ 17 октября 2019

Я рассматриваю 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>;
};

1 Ответ

1 голос
/ 17 октября 2019

До C ++ 17 такой шаблон:

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

не должен разбираться с вариационными шаблонами. То же самое для шаблонов с аргументами по умолчанию (проверьте это, например, с помощью std::vector) - Параметр шаблона и значения по умолчанию . Это был дефект в стандарте и исправление пришло в C ++ 17

...