call of overloaded 'max(char&, char&)' is ambiguous

17 篇文章 0 订阅

最近准备着考试,其中遇到了一个题目,具体程序如下:

#include <iostream>
#include <conio.h>

using namespace std;

#define SAFEDELETE(p) if(p){delete p;p=NULL;}

template<typename T>
T max(T x, T y)
{
    cout<<"This is a template func!"<<endl;
    return (x>y)? x:y;
}
int max(int x, int y)
{
    cout<<"int int"<<endl;

    return (x>y)?x:y;
}
int max(int x, char y)
{
    cout<<"int char"<<endl;

    return (x>y)?x:y;
}

int main(void)
{
    int i=10;
    float f = 3;
    char c = 'c';

    max(i,i);
    max(c,c);
    max(i,c);
    max(c,i);
    max(f,f);

    return 0;
}
首先说问题1:

这个程序在vc6上面是可以通过编译的,而在vc2008和codeblocks是通不过编译的,错误提示是:

call of overloaded 'max(char&, char&)' is ambiguous

其实,原因很简单,因为使用using namespace std所造成的,因为std里面有max(char&, char&)这个函数,所以,会和它造成二义性,也就通不过编译了

所以,改成不使用std namespace然后使用完整的std::就可以了

再来说问题2:

关于重载函数的匹配问题,vc6上面的,第四个结果是int char,而其他编译器是int int的结果,其实后者才是准确的,具体原因如下:

确定最佳可行函数的步骤,首先应确定哪些是完全匹配的,完全匹配从最佳到最差的顺序为
a、完全匹配,但普通函数优于模板函数及模板函数的特化版本
b、提升转换(如:char 和short 转换为 int,及float 转换为 double)
c、标准转换(如:int 转换为 char,及long 转换为 double)
d、用户定义的转换,如类声明中定义的 转换

更为具体的,可以参见百度文库里面的文档:

http://wenku.baidu.com/link?url=EqzXNog4ML3WiXskHdfhUCW35cKG5TwgH8lp_33jw6h354MFqOGvJSF3za3vbCC_yby4-19KfThr8TGD3InrRK34lLEWDQDMzv_StSPYyem

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值