C++模板使用中出现重载不明确
我在模板定义中按照书中的例子,敲进模板定义template<typenameT>Tmax(Tx,Ty),但编译时提示callofoverloaded'max(int&,i...
我在模板定义中按照书中的例子,敲进模板定义template <typename T> T max(T x,T y),但编译时提示call of overloaded 'max(int&, int&)' is ambiguous,cout<<"the MAX int:"<<max(n1,n2)<<endl;我看了一下书上是这样写的没错,后来我想了一下修改为template <typename T> T max(T &x,T &y),结果能正常得到结果,想问一下为什么template <typename T> T max(T x,T y)这样定义是错误的?还是因为我用的是QT+mingw造成的,?
展开
2个回答
展开全部
因为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 &来调用,所以不会产生歧义。
然后 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 &来调用,所以不会产生歧义。
追问
想问一下为什么用::max(n1,n2);可以,我试了一下的确可以,把std;去掉换成std::cout就可以正常输出了,看来的确是这个问题
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询