Я не понимаю, мне кажется, что вызов 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>();
}
};