Я пытаюсь частично специализировать шаблон для мета-функции и столкнулся с проблемой.
Я специализировал шаблон следующим образом:
template <typename A, typename B>
struct Foo;
template <typename A, typename B1>
struct Foo<A, typename A::template Bar<B1>> {
/* use both A and B1*/
};
template <typename A, typename B1>
struct Foo<A, typename A::template Xyz<B1>> {
/* use both A and B1*/
};
Однако это приводит к (Visual Studio 2019 ) в
Error C2764: 'B1': template parameter not used or deducible in partial specialization 'Foo<A,A::Bar<B1>>' (5, 47)
Я предполагаю, что это потому, что я использовал параметр шаблона A
в качестве спецификатора в специализации (typename A::template Bar<B1>
).
Есть ли способ обойти это и использовать параметры в специализациях шаблонов в качестве квалификаторов?
Примечание. В моем сценарии использования первый параметр никогда не является специализированным. Теоретически это может работать для вложения специализированного шаблона в другой класс шаблона (т. Е. Каррирование метафункции), но шаблоны могут быть специализированными только в области пространства имен.