по умолчанию Аргумент относится к специализации - и, по сути, специализация должна принять (так сказать) по умолчанию аргумент базового шаблона (ы). Попытка указать значение по умолчанию по специализации:
template<class A = int, class B=double>
class Base
{};
template<class B=char>
// ...
... является ошибкой.
Аналогично, если мы изменим специализацию, так что его специализация для типа другого, чем по умолчанию, предоставленное базовый шаблон:
template<class A = int, class B=double>
class Base
{};
template<class B>
class Base <char, B>
... то база шаблона будет выбрана.
Итак, что происходит: сначала выбираются типы аргументов шаблона. В этом случае (тип не указан при создании экземпляра) оба типа основаны на аргументах шаблона по умолчанию, указанных в базовом шаблоне.
Затем (как в основном отдельный шаг) он выполняет аналог разрешения перегрузки на всех шаблонах, соответствующих этим типам аргументов. Как обычно для разрешения перегрузки, тип, указанный явно явно, более предпочтительный, чем тот, который указан неявно, поэтому ваша специализация (которая явно указана int
) предпочтительнее базового шаблона (который неявно задает int
).
+1 для обучения меня, что аргументы по умолчанию продолжают применяться к специализациям. – chris
+1 для почти такой же причины @chris сказал. не видел этого. – WhozCraig
Согласен. Отличный вопрос и (в частности), превосходная работа по его заданию, полная SSCCE и хорошее описание как фактического, так и ожидаемого поведения. Отлично сработано! –