Аргумент по умолчанию применяется к специализации, и фактически специализация должна принимать (так сказать) аргумент(ы) по умолчанию базового шаблона. Попытка указать значение по умолчанию в специализации:
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
).
person
Jerry Coffin
schedule
09.09.2013