2012-01-23 38 views
2

使用VS2008,为什么这是行(不允许使用2010)。为什么过载使用无符号__int64和__int64模糊

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”版本并不含糊。

+0

我们需要看到调用它的代码。它不知道要转换为哪种类型。顺便说一句,我会避免使用assert作为您的函数名称,因为它通常会转换为宏来执行实际的调试声明。 – CashCow

回答

3

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

+0

我很惊讶这些转换都是同样有效的。似乎通过转换为无符号值而丢失了可能的负整数这一概念并不是通常所期望的。 (是的,我不会使用断言,这只是一个示例。) – Jim

2

你得到这一点,因为int可以隐式转换到两个__int64unsigned __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