Это связано с очень неясным положением стандарта, в котором, если у вас есть шаблон, который пытается получить доступ к функции шаблона в объекте, тип которого зависит от аргумента шаблона, вы должны использовать ключевое слово template
встранный путь:
this->template f<int>();
Это похоже на странность с typename
, которая возникает с зависимыми типами, за исключением применения к функциям.В частности, если вы пропустите ключевое слово template
, существует неоднозначность парсинга между
this->f<int>()
(то, что вы хотели) и
((this->f) < int) > ()
, что не имеет смысла (следовательно, вашошибка).Использование ключевого слова template
устраняет неоднозначность и заставляет компилятор распознавать, что он смотрит на совершенно правильный вызов шаблонной функции-члена, а не искаженную массу символов.
Надеюсь, это поможет!