Попробуйте следующий код:
template<class T> void g()
{
A<T> a;
a.template f<3>(); // add `template` keyword here
}
В соответствии со стандартом C ++ '03 14.2 / 4:
Когда имя специализации шаблона элемента появляется после .
или ->
в выражении с постфиксом или после спецификатора вложенного имени в квалифицированный идентификатор , а постфиксное выражение или квалифицированный идентификатор явно зависит от параметра-шаблона (14.6.2), имя шаблона элемента должно начинаться с ключевого слова template
. В противном случае предполагается, что имя не является шаблоном.
В будущем стандарте C ++, по-видимому, все еще требуется это ключевое слово в соответствии с черновиком n2857 14.3 / 4. Некоторые компиляторы имеют специальный режим, который позволяет скомпилировать оригинальный код без ошибок (Comeau компилирует его в так называемом расслабленном режиме ).