Для двух частичных специализаций шаблона класса первая является more specialized более высокой, чем вторая, если при следующей перезаписи двух шаблонов функций первый шаблон функции более специализирован, чем второй, в соответствии с ordering rules for function templates:
Каждый из двух шаблонов функций имеет те же параметры шаблона, что и соответствующая частичная специализация.
Каждый шаблон функции имеет один параметр функции, тип которого является шаблон класса специализацией , где аргументы шаблона являются соответствующими параметрами шаблона из шаблона функции для каждого аргумента шаблона в template-argument-list из simple-template-id частичной специализации.
[ Example:
template<int I, int J, class T> class X { }; template<int I, int J> class X<I, J, int> { }; // #1 template<int I> class X<I, I, int> { }; // #2 template<int I0, int J0> void f(X<I0, J0, int>); // A template<int I0> void f(X<I0, I0, int>); // B template <auto v> class Y { }; template <auto* p> class Y<p> { }; // #3 template <auto** pp> class Y<pp> { }; // #4 template <auto* p0> void g(Y<p0>); // C template <auto** pp0> void g(Y<pp0>); // D
Согласно правилам упорядочивания шаблонов функций, шаблон функции B более специализирован, чем шаблон A функции, а шаблон функции D более специализирован, чем шаблон функции C. Следовательно, частичная специализация №2 более специализирована, чем частичная специализация №1, а частичная специализация №4 более специализирована, чем частичная специализация №3. ] — end example