2012-01-23 37 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