In the context of Schedule however, the EvenImpl caches the function pointer and any explicit arguments:
Schedule(delay, &f, 2) caches the address of f, a two-argument function, and the int value 2. In this translation unit that's fine. The compiler doesn't see the invocation through the function pointer; that happens in a different translation unit, for SimulatorImpl.
Your solution, create an explicit one argument overload for f, is the correct one.
HTH,
Peter
[1] http://en.cppreference.com/w/cpp/language/default_arguments