Почему шаблон с аргументами шаблона по умолчанию не может использоваться в качестве шаблона с меньшим аргументом шаблона в параметрах шаблона шаблона

myTemplateTemplate ожидает, что вторым параметром шаблона является шаблон с одним аргументом. myDefaultTemplate - это шаблон с двумя аргументами, а второй аргумент имеет тип int по умолчанию.

В VS2008 я получаю ошибку компиляции: список параметров шаблона для шаблона класса "myDefaultTemplate" не соответствует списку параметров шаблона для параметра шаблона "TT"

Итак, почему myDefaultTemplate нельзя использовать в качестве шаблона только с одним аргументом? Есть ли какие-либо негативные последствия, если компилятор С++ поддерживает его?

template
<typename T1, typename T2 = int>
class
myDefaultTemplate{
      T1 a;
      T2 b;
};

template
<typename T1, template<typename T2> class TT>
class
myTemplateTemplate{
      T1 a;
      TT<T1> b;
};

int main(int argc, char* argv[]){
      myTemplateTemplate<int, myDefaultTemplate> bar; //error here:      
      return 0;
}

Ответ 1

Из стандарта (см. 14.3.3, пункт 1 - [temp.arg.template):

Аргумент шаблона для шаблона-шаблона шаблона должен быть имя шаблона класса, выраженное как id-expression. Только первичные шаблоны классов учитываются при сопоставлении шаблона шаблона аргумент с соответствующим параметром; частичные специализации не учитываются, даже если их списки параметров соответствуют шаблон шаблона.

Это означает, что шаблон myDefaultTemplate будет отображаться только как шаблон 2 аргументов. Аргумент по умолчанию не будет рассмотрен.