1. 程式人生 > >call of overloaded 'max(char&, char&)' is ambiguous

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

最近準備著考試,其中遇到了一個題目,具體程式如下:

#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、使用者定義的轉換,如類宣告中定義的 轉換

更為具體的,可以參見百度文庫裡面的文件: