Es un puntero, así que intente:
a->f();
Básicamente, el operador .(utilizado para acceder a los campos y métodos de un objeto) se utiliza en objetos y referencias, por lo que:
A a;
a.f();
A& ref = a;
ref.f();
Si tiene un tipo de puntero, primero debe eliminar la referencia para obtener una referencia:
A* ptr = new A();
(*ptr).f();
ptr->f();
La a->bnotación suele ser una abreviatura de (*a).b.
Una nota sobre los punteros inteligentes
El operator->puede estar sobrecargado, lo que es utilizado principalmente por punteros inteligentes. Cuando usa punteros inteligentes , también usa ->para referirse al objeto puntiagudo:
auto ptr = make_unique<A>();
ptr->f();