2009-12-23 6 views
3

두 개의 오버로드가 유사한 변환을한다고하는 오류가 발생합니다. 나는 너무 많은 것을 시도했지만 아무도 도왔다. 여기 C++ 함수 오버로드 유사한 변환

코드의 조각

CString GetInput(int numberOfInput, BOOL clearBuffer = FALSE, UINT timeout = INPUT_TIMEOUT); 
CString GetInput(int numberOfInput, string szTerminationPattern, BOOL clearBuffer = FALSE, UINT timeout = INPUT_TIMEOUT); 

내가 문자열 에 동일 수 있는지 이해할 수 없다?이를 코드의 라인 트리거링 : 나는 ++ 6 (그래 나도 알아 옛, 내가 레거시 코드에 일하고 있어요, 그래서 나는 거의 무기력 해요)

편집 비주얼 C를 사용하고

오류는 아마도 그 기능을 어느 BOOL 제 2 매개 변수도 아니고 string하지만, 암시 하나에 변환 할 수있는 유형을 전달하는

l_szOption = GetInput(13, FALSE, 30 * 10); 
+0

문자열은 == std :: string입니까? – AraK

+0

오류를 일으키는 코드 줄은 무엇입니까? –

+0

yep, string == std :: string – akif

답변

4

작동 : T0이이 검사를 증명

(timeout 매개 변수가 UINT으로 선언되었으므로) 함수의 첫 번째 버전에 대한 부호없는 값으로 변경합니다.

e.e. 함수의 첫 번째 버전은 세 번째 인수에 대한 변환이 필요하고 두 번째 버전에는 두 번째 인수 (FALSE0, 두 번째 인수는 string) 로의 변환이 필요합니다. 이 경우 어느 기능도 다른 것보다 우수하지 않으며 과부하 해결에 실패합니다.

봅니다 명시 적으로 세 번째 인수를 부호없는 형식을 제공

l_szOption = GetInput(13, FALSE, 30U * 10); 

또는 (당신이 선호하는 중)

l_szOption = GetInput(13, FALSE, (UINT) 30 * 10); 

예상대로 코드를 컴파일해야한다.

즉, 컴파일러는 코드에 대해 절대적으로 불평 할 수 있습니다. 코드가 실제로 손상되었습니다. 코드에서 문제는 exacty 다음과 같은 간단한 예제이 코드는 정확히 같은 이유로 컴파일 할 수 없게됩니다

void foo(int i, unsigned j); 
void foo(unsigned i, int j); 

int main() { 
    foo(0, 0); 
} 

에서와 같은 성격을 가지고있다.

1

입니다.

예를 들어, 문자 포인터.

1

함수를 호출 할 때 모호성을 해결하려면 두 번째 매개 변수를 BOOL으로 캐스팅하거나 실제로 std :: string 인 경우 string("whatever")을 사용하십시오.

+0

'FALSE'를'BOOL'으로 변환하면이 경우 모호성이 해결되지 않습니다. '(BOOL) FALSE'는 여전히 널 포인터 상수의 유효한 형식입니다. 즉,'std :: string'으로 변환 가능하다는 것을 의미합니다. – AnT

1

는 경우 다음 고려 :

BOOL은 INT의 형식 정의입니다.

GetString(10,'a'); // compiler get confused in resolving the function 

'a'가 BOOL 또는 string으로 변환 될지 여부 ???

static_cast을 사용하여 함수 호출을 호출 할 때 적절한 인수를 지정하면 원하는 함수를 호출 할 수 있습니다.

char ch = 'a'; 
GetString(10,static_cast<BOOL>(ch)); // calls function with 2nd argument as BOOL 

GetString(10,static_cast<string>(ch)); //calls function with 2nd argument as string 
2
GetInput(13, FALSE, 30 * 10); 

내 생각 엔

FALSE ==> o ==> NULL is getting converted to std::string(NULL) 

이 때문에, 그것은 인스턴스화하는 방법을 확인할 수 있다는 것입니다.

GetInput(13, TRUE, 30 * 10); //이 문제가 변환해야합니다 정수 값을 체결 당신이 타임 아웃 인수를 공급하고 있다는 사실로 인해 발생

+0

'FALSE'가'std :: string'으로 변환 될 수 있다는 단순한 사실만으로이 코드는 실패하지 않습니다. 함수의 첫 번째 버전은'BOOL' 유형의 두 번째 인수를 가지며, 이는'std :: string'보다'FALSE'에 더 잘 부합합니다. 내 대답에서 말했듯이 문제는 다르다. 이 문제는 세 번째 인수 인 '30 * 10'에 의해 발생합니다. 첫 번째 함수가 과부하 해결에서 이기기 위해서는 * unsigned * 유형이 있어야합니다. – AnT