В 14.5.5.1 Совпадение частичных специализаций шаблона класса , существует
Если найдено более одной совпадающей специализации, правила частичного порядка (14.5.5.2)используется для определения того, является ли одна из специализаций более специализированной, чем другие.Если ни одна из специализаций не является более специализированной, чем все другие соответствующие специализации, то использование шаблона класса является неоднозначным, и программа является неправильной.
Однако это относится только к вашейпервый случай, когда видны две специализации, и я пока не уверен, что эти две специализации действительны сами по себе.
Однако во втором случае до достижения второй специализации шаблон template-id Unique<3>
уже существует, для которого (благодаря nm, Matthieu M., James Kanze) первая специализация уже создана:
14.5.5 Частичные специализации шаблона класса
Частичная специализация должна быть объявлена до первого использования специализации шаблона класса, которая будет использовать частичную специализацию в результате неявной или явной реализации в каждой единице перевода, в которой происходит такое использование.;Диагностика не требуется.
И в 14.5.5, элемент 8
В списке аргументов частичной специализации шаблона класса, следующееприменяются следующие ограничения:
- Частично специализированное нетипичное выражение аргумента не должно включать параметр шаблона частичной специализации, кроме случаев, когда выражение аргумента является простым идентификатором.[> Пример:
template <int I, int J> struct A {};
template <int I> struct A<I+5, I*2> {}; // error
template <int I, int J> struct B {};
template <int I> struct B<I, I> {}; // OK
- конец примера]
Таким образом, кажется, что нетипичные аргументы не участвуют в создании специализации, если не используются в качестве простого идентификатора (таким образом, Range<(value > 2)>
будет неправильным).
Так что кажетсяВаш код неправильно сформирован.
Не имеет прямого отношения, но все же интересен в этом отношении:
14.7.3 Явная специализация
Размещение явных объявлений специализации для шаблонов функций, шаблонов классов, функций-членов шаблонов классов, статических данных-членов шаблонов классов, классов-членов шаблонов классов, шаблонов классов-членов шаблонов классов, функции-членашаблоны шаблонов классов, функции-члены шаблонов элементов шаблонов классов, функции-члены шаблонов-членов классов, не являющихся шаблонами, шаблоны функций-членов классов-членов шаблонов классов и т. д., а также местоПри объявлении частичной специализации шаблонов классов, шаблонов классов-членов классов, не являющихся шаблонами, шаблонов классов-членов шаблонов классов и т. д., может влиять на правильность формирования программы в соответствии с относительным позиционированием явные объявления специализации и точки их создания в модуле перевода, как указано выше и ниже. При написании специализации будьте осторожны с ее местоположением;или сделать его компиляцией будет таким испытанием, чтобы разжечь его самосожжение.