template<typename A, typename B> class MyClass<int, float> {...
не допускается. Действительно, если вы укажете формальные параметры A
и B
, ваш шаблон должен использовать их.
Второй случай просто нормален: вы говорите, что делаете специализацию без «свободных» параметров.
Промежуточный случай может быть
template<typename A> class MyClass<A, float> {...
, который снова действителен: здесь вы фиксируете только второй параметр шаблона.
Идея частичной специализации заключается в следующем: вы создаете шаблон с некоторыми формальными параметрами и используете их для выражения ограничений на параметры исходного шаблона. Параметры частичной специализации не обязательно должны совпадать с параметрами исходного шаблона. Пример:
template<typename X, typename Y, typename Z> class MyClass<X*, Y(Z&)> {...
будет действительной частичной специализацией для вашего случая. Это можно прочитать как «для произвольных типов X
, Y
и Z
, если параметры шаблона MyClass
соответствуют X*
и Y(Z&)
, используйте эту специализацию». Компилятор должен быть достаточно умным, чтобы соответствовать шаблону типа.