почему перегрузка с неподписанным __int64 и __int64 неоднозначна - PullRequest
2 голосов
/ 23 января 2012

Почему с VS2008 все в порядке (нельзя использовать 2010).

void assert(int exp, int actual) {if (exp!=actual) printf("assert failed\n");}
void assert(unsigned int exp, unsigned int actual) {if (exp!=actual) printf("assert    failed\n");}

Но это неоднозначно.

void assert(__int64 exp, __int64 actual) {if (exp!=actual) printf("assert failed\n");}
void assert(unsigned __int64 exp, unsigned __int64 actual) {if (exp!=actual) printf("assert failed\n");}

Пример текста ошибки

d:\my documents\visual studio 2008\projects\classtest\classtest\classtest.cpp(31) : error C2668: 'assert' : ambiguous call to overloaded function
d:\my documents\visual studio 2008\projects\classtest\classtest\classtest.cpp(12): could be 'void assert(unsigned __int64,unsigned __int64)'
d:\my documents\visual studio 2008\projects\classtest\classtest\classtest.cpp(10): or       'void assert(__int64,__int64)'
while trying to match the argument list '(int, int)'

Это становится только неоднозначным в отношении перегрузки «без знака».Наличие версии "int" и версии "__int64" не является неоднозначным.

Ответы [ 2 ]

3 голосов
/ 23 января 2012

Ваш код фактически использует int и int в качестве параметров.В первом случае он имеет точное совпадение.Во втором случае это не так, и он рассматривает int-> uint64 и int-> int64 как одинаково допустимые преобразования, поэтому он не знает, какой из них выбрать.

2 голосов
/ 23 января 2012

Вы получаете это, потому что int может быть неявно преобразовано в __int64 и unsigned __int64.

Следующее также не компилируется:

void assert(__int64 exp, __int64 actual) {if (exp!=actual) printf("assert failed\n");}
void assert(unsigned __int64 exp, unsigned __int64 actual){if (exp!=actual) printf("assert failed\n");}

int x = 0;
assert(x,x);

Но если x имеет тип __int64, неоднозначность решается.

void assert(__int64 exp, __int64 actual) {if (exp!=actual) printf("assert failed\n");}
void assert(unsigned __int64 exp, unsigned __int64 actual){if (exp!=actual) printf("assert failed\n");}

__int64 x = 0;
assert(x,x);\
//compiles
...