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;
}
Hope this is helpful in resolving this issue.