2011-09-26 5 views
14

나는 C++ 프로그램에서 클래스 작업을하고 있는데, 컴파일러는 "모호한"함수 호출에 대해 불평하고있다. 다른 매개 변수로 정의 된 여러 함수가 있기 때문에 이것이 의심 스럽습니다."모호한"함수 호출을 수정하려면 어떻게합니까?

내가 원하는 컴파일러를 어떻게 알 수 있습니까? 케이스 별 수정 사항을 제외하고, 이런 종류의 문제를 해결할 수있는 타입 캐스팅과 같은 일반적인 규칙이 있습니까?

편집 : 내 경우

, 나는 두 double의 전달하는 cout 문 내부 abs()를 호출했습니다.

cout << "Amount is:" << abs(amountOrdered-amountPaid);

Edit2가 : 나는이 세 가지 헤더를 포함하고있어

:

#include <iostream> 
#include <fstream> 
#include <iomanip> 

using namespace std; 

EDIT3 :

이 코드하지 않고 프로그램을 완료했습니다, 그러나이 퀘스트를 통해 다음을 추구하기 위해 에, 나는 문제를 재현했습니다. 축 어적 오류는 다음과 같습니다.

'abs'로의 호출이 모호합니다.

컴파일러에는 abs의 세 가지 버전이 있으며, 각각은 다른 데이터 유형을 매개 변수로 사용합니다.

+1

코드 예제를 보여 주시겠습니까? –

+1

정말 상황에 따라 다릅니다. 코드를 게시하고 컴파일러 오류에 어떤 함수가 후보가되는지 (최근 GCC가 수행하는지) 필요한 경우 도움이됩니다. –

+2

또한 헤더가 포함됩니다. – mkb

답변

19

당신이 (<cstdlib>를 포함 시켰이다 즉로를 간접적으로는 iostream에 포함되어 있기 때문에) using namespace std;과 함께 이 헤더는 abs()이라는 두 개의 함수를 std에 선언합니다. 하나는 long long을 가져오고 다른 하나는 long을 반환합니다. 또한 <stdlib.h>에서 오는 전역 네임 스페이스 (int을 반환하는)가 있습니다.

수정하려면 : abs()은 두 배가 걸리며 <cmath>입니다. 그러면 실제로 원하는 답을 얻을 수 있습니다. <cstdlib>으로 포함

+4

TL; DR : avoid using namespace'. –

+0

@MatthieuM., iOS SDK에서'std :: abs()'를 사용할 때도이 (sematic) 오류를 보았습니다. 'std ::'를 제거하고'abs()'만 사용하면 오류가 제거됩니다. – iammilind

+1

그래, 문제는 자동 숫자 형식 변환 때문입니다. – mkb

-1

하지 않음이 복근의 INT 버전을 호출하지 않고, 당신이 표현 캐스팅 유형을 시도 할 수없는 이유를 확인 (amountOrdered - amountPaid) INT 일이 무슨

cout <<"Amount is: "<< abs((int)(amountOrdered - amountPaint)); 
+1

"이것이 abs의 int 버전을 호출하지 않는 이유를 모르겠습니다."amountOrdered 및 amountPaid가 두 배가 될 수 있습니까? –

+0

당신은 내가 뭘 생각했는지 확실하지 않습니다! @OP 컴파일러는 long 또는 int에서 double로 타입 변환해야하는지 확실하지 않기 때문에 어떤 버전의 호출 (long 또는 double)을 혼동합니다. Mr.R.Martinho - 내 솔루션은 컴파일러가 어떤 버전을 호출할지 결정하는 데 도움이 될 것으로 생각합니다. 그래서 나는 다소 정확하게 맞 춥니 다. –

4

abs 함수 intlonglong long 과부하된다. double을 인수로 제공하기 때문에 컴파일러는 doubleabs이 허용하는 형식으로 변환하려고 시도하지만 int, long 또는 0으로 변환하려고하는지 여부를 알 수 없습니다. long long이므로 모호합니다.

그러나 실제로는 absdouble이고, double을 반환합니다. 이를 위해서는 <cmath>을 포함해야합니다.double 인수가 정확히 일치하므로 컴파일러에서 불평하지 않습니다.

발생하지 않아야하는 다른 헤더를 포함 시키면 <cstdlib>이 자동으로 포함되는 것처럼 보입니다. 컴파일러는 error: ‘abs’ was not declared in this scope 또는 비슷한 것을 제공해야합니다.

+0

'abs'는 함수 템플릿이 아닙니다. 템플릿 인자를 주면 작동하지 않습니다. 'static_cast (bar)'가 컴파일 될 것입니다. (여전히 잘못된 대답을줍니다.) – mkb

+0

@mkb - 고마워요, 템플릿 기능 전문화가 아니라 단순히 과부하입니다. 그 부분을 편집했습니다. – JohnPS

2

<cmath>에 정의 된 fabs을 사용해보십시오. 인수로는 float, doublelong double이 필요합니다. abs<cmath><cstdlib>에 모두 정의됩니다. 차이는 abs(int), abs(long)abs(long long)<cstdlib>에 정의되어 있고 다른 버전은 <cmath>에 정의되어 있습니다.

+0

이런 종류의 오류를 수정하는 일반적인 해결책은 표준 C 라이브러리 대신 stdio.h 대신 cstdio라는 라이브러리의 C++ 버전을 사용하는 것입니다. C++ 라이브러리는 접두어 'c'와 '.h'가없는 이름을 가지고 있습니다. – Andiana

관련 문제