Question

En utilisant VS2008, pourquoi est-ce OK (pas autorisé à utiliser 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");}

Mais c'est ambigu.

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");}

Exemple de texte d'erreur

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)'

Il ne devient ambigu qu'en ce qui concerne la surcharge «non signée». Le fait d'avoir et une version "int" et une version "__int64" n'est pas ambigu.

Était-ce utile?

La solution

Votre code utilise réellement INT et INT comme paramètres. Dans le premier cas, il a une correspondance exacte. Dans le deuxième cas, ce n'est pas le cas, et il traite Int-> uint64 et int-> int64 comme des conversions tout aussi valides afin qu'il ne sache pas lequel choisir.

Autres conseils

Tu obtiens ça parce que int peut être implicitement converti en deux __int64 et unsigned __int64.

Ce qui suit ne compile pas non plus:

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);

Mais si x est de type __int64 L'ambiguïté est résolue.

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top