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