ответ

6

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&), используйте эту специализацию». Компилятор должен быть достаточно умным, чтобы соответствовать шаблону типа.

+0

отсюда: 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

+0

@uray: да, в этом случае вы используете параметры шаблона. – Vlad

+0

как исправить первый, но использовать шаблон для второго аргумента 'template class MyClass '? – uray

Смежные вопросы