Проблема, с которой вы сталкиваетесь, заключается в том, что вы не можете использовать временный аргумент по умолчанию для функции, принимающей неконстантную ссылку. Временные ссылки не могут быть связаны с неконстантными ссылками.
Если вы не изменяете объект внутри, вы можете просто изменить подпись на:
int f(typename A<T>::base const & arg = typename A<T>::derived())
Если вы на самом деле изменяете переданный аргумент, вы должны использовать другой метод, чтобы учесть необязательные аргументы, самым простым из которых будет использование указателя, который может быть установлен по умолчанию в NULL.