Преобразование из unsigned int
в int
или float
приводит к потере точности, и оба компилятора считают их равными. Вы должны добавить явный случай, чтобы компилятор решал, какой использовать, например ::10000
foo(i, static_cast<float>(f));
Обратите внимание, что нет такой вещи как unsigned float
. Если компилятор принимает это, он не соответствует стандартам (VC2010 предупреждает об этом, не уверен насчет VC2005).
<Ч />
Соответствующими разделами стандарта C ++ 98 являются раздел 4, в котором числовой тип ранжируется как точное совпадение, повышение или преобразование, и раздел 13.3.3.2, в котором определяется, как ранжируются неявные преобразования. разрешение перегрузки. В последнем разделе в подпункте 4 говорится:
Стандартные последовательности преобразования упорядочены по их рангу: точное совпадение - это лучшее преобразование, чем повышение, что лучше, чем преобразование.
Преобразование из unsigned int
в float
или int
в любом случае оценивается как «Преобразование», поэтому оно «неразличимо», что делает перегрузку неоднозначной.
Поскольку unsigned float
не является действительным типом в соответствии со стандартом, трудно сказать, как это применимо в вашей ситуации, но ваш компилятор, по-видимому, рассматривает преобразование из unsigned float
в float
или int
как неразличимое. тоже.