Почему возникает ошибка при вызове функции-члена шаблона с явным параметром типа?

Я не понимаю, мне кажется, что вызов f абсолютно недвусмыслен, но он не скомпилируется с expected primary-expression before ‘int’. Если я прокомментирую строку с вызовом f, она компилируется отлично.

template<typename T>
struct A {
    template<typename S>
    void f() { }
};

template<typename T>
struct B : A<T> {
    void g() {
        this->f<int>();
    }
};

Ответ 1

Это связано с действительно неясным предоставлением стандарта, в котором, если у вас есть шаблон, который пытается получить доступ к функции шаблона в объекте, тип которого зависит от аргумента шаблона, вы должны использовать ключевое слово template в странный способ:

this->template f<int>();

Это похоже на странность с typename, которая возникает с зависимыми типами, кроме как применительно к функциям. В частности, если вы не укажете ключевое слово template, существует неопределенность синтаксического анализа между

this->f<int>()

(что вы намеревались), и

((this->f) < int) > ()

что не имеет смысла (отсюда и ваша ошибка). Использование ключевого слова template здесь устраняет неоднозначность и заставляет компилятор распознавать, что он смотрит на вполне действительный вызов шаблонной функции-члена, а не на искаженную массу символов.

Надеюсь, это поможет!