http://igoro.com/archive/extended-linq-additional-operators-for-linq-to-objects/
http://igoro.com/archive/7-tricks-to-simplify-your-programs-with-linq/
Когда вы ссылаетесь на шаблон, который является членом зависимого типа, вы должны добавить к нему ключевое слово template
. Так должен выглядеть вызов getResult
внутри printStuff
size_t value = a.template getResult<B>();
. Это похоже на использование ключевого слова typename
при обращении к вложенным типам имен в зависимом типе. По какой-то причине бит о typename
с вложенными типами довольно хорошо известен, но подобное требование для шаблона
с вложенными шаблонами относительно неизвестно.
Обратите внимание, что общий синтаксис структура немного другая. typename
всегда ставится перед полным именем типа, а шаблон
вставляется посередине.
Опять же, это необходимо только при доступе к члену шаблона зависимого типа , который в приведенном выше примере будет A
в printStuff
. Когда вы вызываете foo.getResult <>
в main
, тип foo
не зависит, поэтому нет необходимости включать шаблон
ключевое слово.
Ваш код неправильно сформирован в соответствии со стандартом C ++ 14.2 / 4:
Когда имя специализации шаблона элемента появляется после
.
или->
в постфиксном-выражении , или после вложенного-спецификатора-имени в квалифицированном-идентификаторе , и постфиксе- выражение или квалифицированный идентификатор явно зависит от параметра шаблона (14.6.2), имя шаблона элемента должно начинаться с префикса ключевого словашаблона
. В противном случае предполагается, что имя не является шаблоном.
Итак, вы должны написать size_t value = a.template getResult ();