В специализации шаблона имя, которое вы выбираете для аргументов шаблона, является переменными без вывода сообщений.Все следующее точно эквивалентно:
template<class T, class U, int N> class A<T, U, N> { /*...*/ };
template<class U, class T, int N> class A<U, T, N> { /*...*/ };
template<class F, class G, int Z> class A<F, G, Z> { /*...*/ };
template<class OnceUpon, class ATime, int ThereWere> class A<OnceUpon, ATime, ThereWere> { /*...*/ };
В частности, имена , которые вы выбираете, не должны совпадать с именем "оригинального" шаблонаопределение.
В комментариях вы спросили:
В коде из моего вопроса № 1 и № 3 есть 2 и 1 список параметров соответственно.Например, почему бы не включить другие переменные, которые были в списке параметров для основного шаблона?
Так работает специализация частичная .Но давайте сделаем небольшое резервное копирование.
Это шаблонный класс:
template<class T1, class T2>
struct X
{};
Вот его конкретная специализация:
X<int, int>;
Теперь, допустим, я хочучтобы определить поведение для X<T1, T2>
с T1 == T2
, это означает не только X<int, int>
, но также X<double, double>
, X<float&, float&>
, X<std::string, std::string>
и всю бесконечность этих явных специализаций.
Для этого мне нужно определить частичную специализацию, которая зависит от одного типа (который играет роли как T1
, так и T2
).Таким образом, эта специализация будет введена template<class T>
: только один тип:
template<class T>
struct X<T, T>
{ using type = T; };
Если бы вы использовали два параметра (template<class T, class WhatToDoWithThatType>
), что бы использовать второй?