Что неправильно с вызовом f (0), так это разрешение неоднозначное. Обе ваши перегруженные функции имеют указатель, который в этом случае может быть разрешен только с помощью приведения.
f((int*)0)
В зависимости от того, что вы пытаетесь сделать, есть и другие варианты, которые не являются двусмысленными.