Qt5.3编译错误——call of overloaded ‘max(int int)’is ambiguous
错误描述:
今天在使用Qt写一个C++函数模板的测试程序的时候,编译的时候,编译的时候出现如下错误:

错误描述为:在main函数中,进行函数max()重载时,出现(ambiguous)含糊的,不明确的;引起歧义的使用;
因为第一次遇到这种错误,写篇内容纪念一下吧。
测试代码如下:
#include <iostream>
using namespace std; template <typename T>//typename == class
T max(T a,T b)
{
return a>b?a:b;
}
int main()
{
int a=,b=;
cout<<max(a,b)<<endl;
cout<<max(,)<<endl;
cout<<max(,)<<endl;
cout<<max(1.1f,2.2f)<<endl;
cout<<max(.11l,.22l)<<endl;
cout<<max('A','C')<<endl;
//上面都是隐式的调用int,float.double.char类型的,而下面必须显示的调用,
//因为1是int类型的,而2.0是double类型的,此时,如果不明确指定数据类型,编译器无法识别。
cout<<max<int>(,2.0)<<endl;
}
单从代码看,我看不出什么错误,而且我记得当初学习C++模板的时候,也是这样写的,只不过,当初使用的IDE是VC6.0,难道环境不同。所以我把代码贴到VC上,测试一下,完美的成功运行了。看来真是IDE不同的问题。但对于Qt,应该有解决办法的,上网找了一下,原来是因为函数名冲突的问题,这里我先说下解决方法。
解决方法:
- 调用时声明名字空间,把max(a,b);改成::max(a,b);前加::,避免冲突
- 改变函数名称,把自定义的函数max改成myMax或其它。
造成问题的原因:
max函数与标准库的std::max函数冲突。
看来Qt中已经有了标准的max()的函数了,我测试了一下,还真有这个函数。
问题深究:
从这个错误中,我们知道自己写的函数名容易和标准库或其他文件里的函数冲突,那么C++是怎么处理函数名冲突的呢?这就用到了命名空间。
名称空间是一项c++de 特性,是用来解决在编写大型程序中不同文件(厂商)中相同变量名问题。 例如:就像我编写的函数max和标准的max,为了能够准确调用其中一个max()函数,我们将这两个函数分别放在不同在命名空间单元中。这样就可以用 "命名空间::函数名" 的方式准确调用所需函数。
- ::max();//调用的自己写的max()
- std::max();//调用的标准模板库的max
我们经常会使用 using namespace std; 其中的std是c++在标准命名空间。
要让程序访问std有以下四种方法:
- 将using namespace std;放在函数定义之前,让文件中所有的函数都能够使用命名空间std中在元素。
- 将using namespace std;放在特定在函数定义中,让该函数能够使用命名空间std中元素。
- 在特定函数中使用using std::cout; 这样的编译指令,让该函数使用命名空间std中所指定在元素,如 cout。这种方法在好处是,防止自己定义的变量名与std中在元素名重复。
- 完全不使用编译指令using,在需要使用std中元素时,使用前缀std::。
通过上面的第4条,这个问题的解决方法还有一种,就是不使用 using namespace std; ,但是cout,cin等一些标准的库函数就不能使用了,所以最好的办法是修改函数名。
Qt5.3编译错误——call of overloaded ‘max(int int)’is ambiguous的更多相关文章
- QT编译错误: multiple definition of `qMain(int, char**)'
QT使用过程中来回添加修改代码,结果出现了编译错误:error: multiple definition of `qMain(int, char**)' 一直看我的源文件是都哪里有错误,最后发现是在p ...
- Qt5.编译错误.error: C2338: The slot requires more arguments than the signal provides.
1.Qt563x86vs2015,遇到如下 编译错误: error: C2338: The slot requires more arguments than the signal provides. ...
- 常见C语言编译错误解析【转】
C语言编译错误信息及说明1. 在函数 ‘transform’ 中:7: 错误:expected ‘;’ before ‘{’ token 解释:‘{’之前的某个语句缺少分号‘;’: 2. 在函数 ...
- xamarin.forms新建项目android编译错误
vs2015 update3 新建的xamarin.forms项目中的android项目编译错误.提示缺少android_m2repository_r22.zip,96659D653BDE0FAEDB ...
- 《转载》使用org.w3c.dom.Element的setTextContent()、getTextContent()方法时出现编译错误
今天在更新项目后进行编译时,出现如下错误一堆: 编译错误 Google之,在stackoverflow上看到如下的解决方法: I came here with the same problem. Ev ...
- asp.net教程:编译错误同时存在于不同dll中
asp.net 编译错误类型“同时存在于”不同的dll中. 出现这种错误大概有三种情况: 1.ASPX页面,一个*.ASPX,对应着一个*.cs文件,两者其实是一个文件,通过两者实现代码分离,每个*. ...
- VS2010出现FileTracker : error FTK1011编译错误的解决办法
VS2010出现FileTracker : error FTK1011不知道是不是vs2010的一个bug,反正有人提交了. FileTracker : error FTK1011编译错误的解决办法有 ...
- PowerDesginer 生成的Oracle 11g 组合触发器代码编译错误(29): PLS-00103
问题描述: 采用PowerDesigner15针对Oracle 11g 创建物理数据模型,想实现一个字段的自增,采用如下步骤: 1.创建序列,命名为Sequence_1; 2.在自增字段编辑窗口中,选 ...
- 我看见的第一个XCODE编译错误 - Command /applications.../clang failed with exit code 1
开始用XCODE学习Apple相关开发的东东,写些demo熟悉Object C,一直还没看见什么问题,昨晚在家把一些demo上传到代码服务器,今天在另外一台机器上下载下来编译,出现了问题: Preco ...
随机推荐
- 使用C#代码部署SharePoint 2013开发包简单总结(一)
这篇文章将总结下如何将自己开发的列表.Web部件.事件接收器等元素部署到SharePoint的服务器.因水平有限,我的做法未必是最佳实践,会有些错误理解和疏漏,欢迎各位高手批评指正——但一定要能给出更 ...
- LoopBackJS 之 文件上传下载——使用loopback-component-storage
参考链接: http://loopback.io/doc/en/lb2/Storage-component.html#creating-a-storage-component-data-source ...
- C++内存分配及变长数组的动态分配
//------------------------------------------------------------------------------------------------ 第 ...
- Redis多机常用架构-主从
本文内容摘录自同事Perry Zhang的讲解,如需转载须本人同意. 1.主从 命令:slaveof <IP><PORT> redis主从配置:redis支持master-sl ...
- Cocostudio 文章列表
Cocostudio 文章列表 Cocostudio(1) 容器层的使用- ScrollView ListView PageViewhttp://www.cnblogs.com/TS-qrt/arti ...
- this、super关键字
this关键字 this 关键字用来表示当前对象本身,或当前类的一个实例,通过 this 可以调用本对象的所有方法和属性. public class Demo{ public int x = 10; ...
- GIT FLOW 时序图
git flow sequence md link: git branching model master->master branch: use default branch Note rig ...
- Eclipse中支持js提示
使用eclipse自带的插件,无需另外安装插件,具体步骤如下 1.打开eclipse→Windows→Preferences→Java→Editor→Content Assist 修改Auto Act ...
- C#中调用python方法
最近因为项目设计,有部分使用Python脚本,因此代码中需要调用python方法. 1.首先,在c#中调用python必须安装IronPython,在 http://ironpython.codepl ...
- ARCGIS自定义下拉列表
1 创建一个geodatabase数据库 2 点击属性--->Domain-->>输入名称,在下面的属性设置中选择coded value 3 在下面的列表中输入下拉列表中可供选择 ...