因为STL的namespace std里也有一个max(const int &x, const int &y),然后你定义的模板会被解释为max(int x, int y)。
然后 max(n1, n2)调用两个都是对的,编译器不知道该调用哪个好,所以就报错啦。
你可以用::max(n1, n2)调用你的函数,用std::max(n1, n2)调用stl的函数。
至于对于max(int &x, int &y)和max(const int &x, const int &y),因为n1和n2都是int类型,编译器优先选择可修改值的int &来调用,所以不会产生歧义。
换个名字。std::max是C++标准库定义的模板,你再定义一个重载解析会出现冲突! 这就是为什么不要使用using namespace std;的原因。