por que a sobrecarga com __int64 e __int64 não assinados é ambígua
-
12-11-2019 - |
Pergunta
Usando VS2008, por que isso está OK (não é permitido usar 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");}
Mas isso é ambíguo.
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");}
Exemplo de texto de erro
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)'
Só fica ambíguo no que diz respeito à sobrecarga 'não assinada'.Ter uma versão "int" e uma versão "__int64" não é ambíguo.
Solução
Na verdade, seu código está usando int e int como parâmetros.No primeiro caso, tem uma correspondência exata.No segundo caso, isso não acontece e trata int->uint64 e int->int64 como conversões igualmente válidas, portanto não sabe qual escolher.
Outras dicas
Você está entendendo isso porque int
pode ser implicitamente convertido para ambos __int64
e unsigned __int64
.
O seguinte também não compila:
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);
Mas se x
é do tipo __int64
a ambiguidade está resolvida.
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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow