I think that the key might be about the non-const reference details and to bind an object of a different type.
Here’s a Template example:
template <typename Iterator> void f(Iterator& p) { ++p; }
Live Demo
Hope this is helpful in resolving this issue.