2

用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”版本并不模棱两可。

4

2 回答 2

3

您的代码实际上使用 int 和 int 作为参数。在第一种情况下,它具有完全匹配。在第二种情况下,它不会,并且它将 int->uint64 和 int->int64 视为同样有效的转换,因此它不知道选择哪一个。

于 2012-01-23T14:59:55.117 回答
2

你得到这个是因为int可以隐式转换为__int64 and 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
于 2012-01-23T14:59:10.803 回答