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 ...
随机推荐
- js如何判断手机机型
<script language="javascript"> window.onload = function () { alert("1"); v ...
- 使用IConfigurationSectionHandler在web.config中增加自定义配置
一. 场景 这里仅举一个简单应用的例子,我希望在web.config里面增加网站的基本信息,如:网站名称,网站版本号,是否将网站暂时关闭等.二. 基本实现方法1. 定义配置节点对应的类:Site ...
- 自话自说——POI使用需要注意一个地方
2015.12.1 天气 不怎么好 心情跟天气一样.知道为什么吗,因为昨晚一晚没睡你懂吗... 今天在用POI操作excel的时候,遇到了一个很恶心的地方,这个地方真的有那种让我不相信编程的感觉 ...
- [UCSD白板题] Majority Element
Problem Introduction An element of a sequence of length \(n\) is called a majority element if it app ...
- Excel公式设置单元格颜色
Excel2010 “条件格式"-"新建规则"-"使用公式确定要设置格式的单元格" 公式如下: =OR(H2<=-20%,H2>=20%, ...
- UVA 12299 RMQ with Shifts(线段树:单点更新)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- 【转】react 状态与属性区别
prop state 能否从父组件获取初始值 是 否 能否由父组件修改 ...
- GridView里的文本框改变事件
<asp:TemplateField HeaderText="实收数量"> <ItemTemplate> <asp:TextBox ID=" ...
- webform 中使用ajax
常用的方式有 js –> WebService , js->*.ashx, js->WebAPI, js->MVC Controller->Action. 前两种就不说 ...
- [转]c++中vector的使用
C++中的vector使用范例 一.概述 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector是一个容器,它能够存放各种类型的对象,简 ...