2012-01-23 3 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"버전이 모호하지 않습니다. int이 암시 적으로 모두 __int64unsigned __int64로 변환 할 수 있기 때문에

+0

코드를 호출해야합니다. 변환 할 유형을 알지 못합니다. 그건 그렇고, 나는 실제 디버그 어설 션을 수행하기 위해 종종 매크로로 변환되기 때문에, 당신의 funtion 이름으로 assert를 사용하는 것을 피할 것이다. – CashCow

답변

3

코드는 실제로 매개 변수로 int와 int를 사용합니다. 첫 번째 경우에는 정확히 일치합니다. 두 번째 경우에는 그렇지 않으며 int-> uint64 및 int-> int64를 똑같이 유효한 변환으로 처리하므로 어느 것을 골라야할지 알 수 없습니다.

+0

두 전환이 모두 똑같이 유효하다는 사실에 놀랐습니다. 부호없는 값으로 변환함으로써 잠재적으로 음의 정수가 있다는 개념을 잃어버린 것처럼 보입니다. 일반적으로 기대되는 것은 아닙니다. (그렇다. 나는 assert를 사용하지 않을 것이고, 이것은 단지 샘플 일 뿐이다.) – Jim

2

이가 있어요.

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