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=1,b=2;
    cout<<max(a,b)<<endl;
    cout<<max(1,2)<<endl;
    cout<<max(2,3)<<endl;
    cout<<max(1.1f,2.2f)<<endl;
    cout<<max(1.11l,2.22l)<<endl;
    cout<<max(‘A‘,‘C‘)<<endl;
    //上面都是隐式的调用int,float.double.char类型的,而下面必须显示的调用,
    //因为1是int类型的,而2.0是double类型的,此时,如果不明确指定数据类型,编译器无法识别。
    cout<<max<int>(1,2.0)<<endl;
}

  单从代码看,我看不出什么错误,而且我记得当初学习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等一些标准的库函数就不能使用了,所以最好的办法是修改函数名。

时间: 2024-08-02 13:32:26

Qt5.3编译错误——call of overloaded ‘max(int int)’is ambiguous的相关文章

QT编译错误: multiple definition of `qMain(int, char**)&#39;

QT使用过程中来回添加修改代码,结果出现了编译错误:error: multiple definition of `qMain(int, char**)' 一直看我的源文件是都哪里有错误,最后发现是在pro文件中出的问题,频繁的添加以及移除文件,导致HEADERS以及SOURCES中会重复添加 解决办法:把重复项删除! QT编译错误: multiple definition of `qMain(int, char**)' 原文地址:https://www.cnblogs.com/MakeView6

MongoDB在MFC下使用C++驱动编译错误的解决

.post p{text-indent: 2em;} 今天使用MongoDB的C++驱动,在编译连接的时候一直出现错误,显示的string_data.h下93行max宏的问题,可视其本身并不是调用max宏,而是调用 std::numeric_limits<size_t>::max 这样就是产生错误,通过搜索发现解决方法(参考网址:http://blog.chinaunix.net/uid-17102734-id-2830143.html),将该函数用括号括起来,避免windows定义的混淆,具

图文说明Visual Studio 2013编译libpqxx步骤以及常见编译错误

编译步骤(x86版本) 1.下载并安装postgresql,点击进入下载地址.下载界面如下: 目前最新版本是9.5.1,我下载了 Win x86-32 的最新版本.安装后目录如下: 2.下载并解压缩libpqxx,点击进入下载地址.下载界面如下: 目前最新版本是4.0.1,我下载了libpqxx-4.0.1.tar.gz 压缩包.解压后目录如下: 3.编译环境准备.(安装或解压路径请以实际的为准,本文路径仅供参考) 进入libpqxx的解压路径 D:\Program Files (x86)\li

visual studio编译错误集(转)

1.error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 在项目属性->Configration Properties->C/C++->Command Line页面的Additional Options中加入/wd4430 2.error MSB3073: The command regsvr32 /s /c 解决办法 最近将VC2002 代码移植到VC2010,

Error:Execution failed for task &#39;:app:compileDebugAidl&#39;. &gt; aidl is missing(Android Studio编译错误)

今天下载了一个1.2.1.1版本的Android Studio,使用VPN更新好SDK之后就新建了一个hello world工程测试一下环境,然后就出现以下错误: Error:Execution failed for task ':app:compileDebugAidl'. > aidl is missing 什么情况?全新安装的环境也有错误?Google发布这个工具时没有测试好吗? 没搞过这个工具,一阵搜索得到以下方案: 1.右键工程->Open Module Settings 2.将Bu

OSG+QT5+vs2010编译

OSG+QT5+vs2010编译 作者:[email protected]  本文属于原创,转载请注明出处. 由于网上没有找到关于编译QT5环境下的OSG,自己就研究了下,记录下整个过程,希望能帮到大家. 1. 准备工作 下载源代码: A.openscenegraph 3.2.1(当前最新的realease版本) http://www.openscenegraph.org/downloads/developer_releases/OpenSceneGraph-3.2.1.zip B.osg-3r

Cocos2d-x文件编译错误解决

编译出现的错误: 1>------ 已启动生成: 项目: HelloCpp, 配置: Debug Win32 ------ 1>生成启动时间为 2014/5/9 14:43:43. 1>InitializeBuildStatus: 1>  正在创建"Debug.win32\HelloCpp.unsuccessfulbuild",因为已指定"AlwaysCreate". 1>ClCompile: 1>  所有输出均为最新. 1>

解决新建Support7Demos的sample时出现编译错误和运行报错出现的问题

右键New->Other->Android Sample Project->选择Android 4.4.2->选择Support7Demos ,finish. 会出现编译错误 解决如下: 1.把这三个文件导入到Eclipse里, 这三个是库文件,并且勾选COPY到工作空间里选项 如果没有这三个文件,就从这里下载 2.导入三个library工程后,mediarouter会无法编译,打开工程属性在anroid里将api-level改成17,添加依赖工程appcompat 3.就是将刚才

java编译错误 程序包javax.servlet不存在javax.servlet.*

java编译错误 程序包javax.servlet不存在javax.servlet.* 编译:javac Servlet.java 出现 软件包 javax.servlet 不存在 软件包javax.servlet.http 不存在 等错误 由于servlet和JSP不是Java平台JavaSE(标准版)的一部分,而是Java EE(企业版)的一部分,因此,必须告知编译器servlet的位置. 解决“软件包 javax.servlet不存在”错误的方法: 1. 搜索servlet-api.jar