int Max(int x, int y) { return x >= y ? x : y; }
double Max(double x, double y) { return x >= y ? x : y; }
double m = 11.5, n = 15.5;
cout << "Max=" << Max(m, n) << endl; // 輸出 15,警告 C4244
按 C++ 標準重載決議規則,Max(double, double) 應為最佳匹配(精確匹配,無需轉換)。輸出 15 並警告「double 轉 int 可能丟失數據」,說明實際調用了 Max(int, int)。
調用點可見的聲明中缺少 double Max(double, double) 的聲明。
double 版本的聲明double 版本被 #ifdef 排除編譯double Max(double, double);15.5 且無警告float → double, int → long 等double → int, int → double 等(可能縮窄)...double → double 屬第 1 級,double → int 屬第 3 級。編譯器必須選擇第 1 級候選函數。
若出現「明顯更好的匹配未被選擇」,99% 是候選函數集合不完整。檢查頭文件包含、前向聲明、條件編譯、命名空間可見性。