call of overloaded 'max(char&, char&)' is ambiguous
阿新 • • 發佈:2019-01-31
最近準備著考試,其中遇到了一個題目,具體程式如下:
首先說問題1:#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; }
這個程式在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、使用者定義的轉換,如類宣告中定義的 轉換
更為具體的,可以參見百度文庫裡面的文件: