博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt5.3编译错误——call of overloaded ‘max(int int)’is ambiguous
阅读量:4977 次
发布时间:2019-06-12

本文共 1347 字,大约阅读时间需要 4 分钟。

错误描述:

今天在使用Qt写一个C++函数模板的测试程序的时候,编译的时候,编译的时候出现如下错误:

错误描述为:在main函数中,进行函数max()重载时,出现(ambiguous)含糊的,不明确的;引起歧义的使用;

因为第一次遇到这种错误,写篇内容纪念一下吧。


测试代码如下:

#include 
using namespace std;template
//typename == classT max(T a,T b){ return a>b?a:b;}int main(){ int a=1,b=2; cout<
<
(1,2.0)<

  单从代码看,我看不出什么错误,而且我记得当初学习C++模板的时候,也是这样写的,只不过,当初使用的IDE是VC6.0,难道环境不同。所以我把代码贴到VC上,测试一下,完美的成功运行了。看来真是IDE不同的问题。但对于Qt,应该有解决办法的,上网找了一下,原来是因为函数名冲突的问题,这里我先说下解决方法。


解决方法:

  1. 调用时声明名字空间,把max(a,b);改成::max(a,b);前加::,避免冲突
  2. 改变函数名称,把自定义的函数max改成myMax或其它。

造成问题的原因:

max函数与标准库的std::max函数冲突。

看来Qt中已经有了标准的max()的函数了,我测试了一下,还真有这个函数。


问题深究:

从这个错误中,我们知道自己写的函数名容易和标准库或其他文件里的函数冲突,那么C++是怎么处理函数名冲突的呢?这就用到了命名空间。

名称空间是一项c++de 特性,是用来解决在编写大型程序中不同文件(厂商)中相同变量名问题。​ 例如:就像我编写的函数max和标准的max,为了能够准确调用其中一个max()函数,我们将这两个函数分别放在不同在命名空间单元中。这样就可以用 "命名空间::函数名" 的方式准确调用所需函数。

  • ::max();//调用的自己写的max()
  • std::max();//调用的标准模板库的max

我们经常会使用 using namespace std; 其中的std是c++在标准命名空间。

要让程序访问std有以下四种方法:

  1. 将using namespace std;放在函数定义之前,让文件中所有的函数都能够使用命名空间std中在元素。​
  2. 将using namespace std;放在特定在函数定义中,让该函数能够使用命名空间std中元素。​
  3. 在特定函数中使用using std::cout; 这样的编译指令,让该函数使用命名空间std中所指定在元素,如 cout。这种方法在好处是,防止自己定义的变量名与std中在元素名重复。​
  4. 完全不使用编译指令using,在需要使用std中元素时,使用前缀std::。

  通过上面的第4条,这个问题的解决方法还有一种,就是不使用 using namespace std; ,但是cout,cin等一些标准的库函数就不能使用了,所以最好的办法是修改函数名。

转载于:https://www.cnblogs.com/zi-xing/p/4461344.html

你可能感兴趣的文章
Where does Visual Studio look for C++ Header files?
查看>>
Java打包可执行jar包 包含外部文件
查看>>
Windows Phone开发(37):动画之ColorAnimation
查看>>
js中escape,encodeURI,encodeURIComponent 区别(转)
查看>>
sass学习笔记-安装
查看>>
Flask (二) cookie 与 session 模型
查看>>
修改添加网址的教程文件名
查看>>
[BZOJ 1017][JSOI2008]魔兽地图DotR(树形Dp)
查看>>
裁剪图片
查看>>
数据结构实习 problem L 由二叉树的中序层序重建二叉树
查看>>
VS中展开和折叠代码
查看>>
如何确定VS编译器版本
查看>>
设置PL/SQL 快捷键
查看>>
个人阅读作业7
查看>>
转载:深入浅出Zookeeper
查看>>
GMA Round 1 新程序
查看>>
node anyproxy ssi简易支持
查看>>
编译预处理指令:文件包含指令、宏定义指令、条件编译指令
查看>>
PHP函数 ------ ctype_alnum
查看>>
网站安全
查看>>