【问题标题】:why is overload with unsigned __int64 and __int64 ambiguous为什么无符号 __int64 和 __int64 的重载不明确
【发布时间】:2012-02-16 21:59:39
【问题描述】:

用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”版本是没有歧义的。

【问题讨论】:

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

标签: visual-c++ overloading unsigned-long-long-int


【解决方案1】:

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

【讨论】:

  • 我很惊讶这两种转换都同样有效。似乎通过转换为无符号值而失去了可能存在负整数的概念并不是通常所期望的。 (是的,我不会使用断言,这只是一个示例。)
【解决方案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

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    相关资源
    最近更新 更多