使用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)'
对于'unsigned'过载,它只是模糊不清。拥有和“int”版本和“__int64”版本并不含糊。
答案 0 :(得分:3)
您的代码实际上使用int和int作为参数。在第一种情况下,它具有完全匹配。在第二种情况下它没有,并且它将int-> uint64和int-> int64视为同等有效的转换,因此它不知道要选择哪一个。
答案 1 :(得分:2)
您收到此消息是因为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