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