This is caused in part by your use of using namespace std;
.
There is a function in the standard library, std::distance
, that is used to compute the distance between two iterators into a container. That function is being selected during overload resolution instead of your distance
function.
If you don't use using namespace std;
, you won't have this problem. Your use of using namespace std;
brings all of the names from the std
namespace into the global namespace. This is bad because there are a lot of common names in namespace std
and it can cause convoluted issues during name lookup, as you've discovered here.
In general, prefer not to use using namespace
, especially not at file scope. It's far easier and clearer in the long run to qualify each of the names that you want to use.