Ответ 1
Проблема синтаксическая. Вы должны использовать disambiguator template
в этом случае, так что ваш вызов шаблона функции-члена будет правильно разобран:
return (G.template getSC<SC<T> >().value * S.template getSC<SC<T> >().value);
// ^^^^^^^^^ ^^^^^^^^^
Этот дизассемблер помогает компилятору распознать, что следующее G.
- это спецификация шаблона члена, а не, например, элемент данных, называемый getSC
, за которым следует <
(меньше).
Стандартная ссылка для template
disambiguator - это параграф 14.2/4 стандарта С++ 11:
Когда имя специализации шаблона члена появляется после
.
или->
в постфиксном выражении или после вложенного имени-спецификатора в идентификаторе с квалификацией, а выражение объекта postfix-expression - это тип -зависимый или специфицированный вложенным именем-идентификатор в identified-id относится к зависимому типу, но имя не является членом текущего экземпляра (14.6.2.1), имя шаблона члена должно быть префиксным по ключевому словуtemplate
. В противном случае предполагается, что имя называется не-шаблоном. [Пример:struct X { template<std::size_t> X* alloc(); template<std::size_t> static X* adjust(); }; template<class T> void f(T* p) { T* p1 = p->alloc<200>(); // ill-formed: < means less than T* p2 = p->template alloc<200>(); // OK: < starts template argument list T::adjust<100>(); // ill-formed: < means less than T::template adjust<100>(); // OK: < starts template argument list }
-end пример]