Почему шаблон с аргументами шаблона по умолчанию нельзя использовать в качестве шаблона с меньшим количеством аргументов шаблона в параметрах шаблона шаблона - PullRequest
10 голосов
/ 08 июля 2011

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

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

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

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 Ответ

7 голосов
/ 08 июля 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...