Шаблоны: обработайте по шаблону функцию, не играющую хорошо с шаблонной функцией членства класса

2 ответа

Когда вы ссылаетесь на шаблон, который является членом зависимого типа, вы должны добавить к нему ключевое слово template . Так должен выглядеть вызов getResult внутри printStuff

size_t value = a.template getResult<B>();

. Это похоже на использование ключевого слова typename при обращении к вложенным типам имен в зависимом типе. По какой-то причине бит о typename с вложенными типами довольно хорошо известен, но подобное требование для шаблона с вложенными шаблонами относительно неизвестно.

Обратите внимание, что общий синтаксис структура немного другая. typename всегда ставится перед полным именем типа, а шаблон вставляется посередине.

Опять же, это необходимо только при доступе к члену шаблона зависимого типа , который в приведенном выше примере будет A в printStuff . Когда вы вызываете foo.getResult <> в main , тип foo не зависит, поэтому нет необходимости включать шаблон ключевое слово.

40
ответ дан 29 November 2019 в 04:17
поделиться

Ваш код неправильно сформирован в соответствии со стандартом C ++ 14.2 / 4:

Когда имя специализации шаблона элемента появляется после . или -> в постфиксном-выражении , или после вложенного-спецификатора-имени в квалифицированном-идентификаторе , и постфиксе- выражение или квалифицированный идентификатор явно зависит от параметра шаблона (14.6.2), имя шаблона элемента должно начинаться с префикса ключевого слова шаблона . В противном случае предполагается, что имя не является шаблоном.

Итак, вы должны написать size_t value = a.template getResult ();

9
ответ дан 29 November 2019 в 04:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: