template<typename A, typename B> class MyClass<int, float> {...
должен быть не допускаются. Действительно, если вы укажете формальные параметры A
и B
, ваш шаблон должен их использовать.
Второй случай нормальный: вы говорите, что вы специализируетесь без «свободных» параметров.
Промежуточный случай может быть
template<typename A> class MyClass<A, float> {...
которая снова действует: здесь вы фиксируете только 2-й параметр шаблона.
Идея частичной специализации следующая: вы создаете шаблон с некоторыми формальными параметрами и используете их для выражения ограничений на параметры исходного шаблона. Параметры частичной специализации не должны совпадать с параметрами исходного шаблона. Пример:
template<typename X, typename Y, typename Z> class MyClass<X*, Y(Z&)> {...
будет действительной частичной специализацией для вашего случая. Это можно прочитать как «для произвольных типов X
, Y
и Z
, если параметры шаблона MyClass
соответствуют и Y(Z&)
, используйте эту специализацию». Компилятор должен быть достаточно умным, чтобы соответствовать шаблону типа.
отсюда: http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a.doc/language/ref/partial_specialization.htm Я получил шаблон <класс T, класс U, int I> struct X {..' –
uray
@uray: да, в этом случае вы используете параметры шаблона. – Vlad
как исправить первый, но использовать шаблон для второго аргумента 'template class MyClass '? –
uray