Вы вызываете функцию, которая ожидает ссылку на объект с указателем на указанный объект (который является несовместимым типом).Чтобы получить код для компиляции, вы должны вызвать foo следующим образом:
a->foo(*b);
По существу, вы разыменовываете указатель, чтобы получить реальный объект и передать его в foo
.Компилятор позаботится о передаче ссылки на объект вместо самого объекта.