2014-07-15 6 views
6

다음 코드를 실행하는 데 문제가 있습니다. 나는 이것을 가지고있다 : 오류 C2668 : 'pow': 오버로드 된 함수에 모호한 호출. static_cast를 사용하여 적절한 형식으로 인수를 수동으로 캐스팅하려고 시도했지만 일부 포인터 오류가 발생합니다.오버로드 된 함수 'pow'에 대한 모호한 호출

이 프로그램은 10

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 
#include <string.h> 
#include <math.h> 

//base 16 to base 10 

int convert(char *n){ 
    int result = 0; 
    for (int i = strlen(n) - 1; i >= 0; i--){ 
     if (n[i] >= 'a') 
      result += (n[i] - 'a' + 10)* pow(16, strlen(n) - i - 1); 
     else 
     if (n[i] >= 'A') 
      result += (n[i] - 'A' + 10)* pow(16, strlen(n) - i - 1); 
     else 
     if (n[i] >= '0') 
      result += (n[i] - '0')* pow(16, strlen(n) - i - 1); 
    } 
    return result; 
} 

void main(void){ 
    char n[10]; 
    printf("Introduceti numarul: "); scanf("%s", n); 
    printf("Numarul in baza 10 este: %d", convert(n)); 
    _getch(); 
} 

사람들은 모든 오류입니다 기지로 기수 16의 숫자를 변환해야합니다.

1>------ Build started: Project: pr8, Configuration: Debug Win32 ------ 
1> pr8.cpp 
1> error C2668: 'pow' : ambiguous call to overloaded function 
1> could be 'long double pow(long double,int) throw()' 
1> or  'long double pow(long double,long double) throw()' 
1> or  'float pow(float,int) throw()' 
1> or  'float pow(float,float) throw()' 
1> or  'double pow(double,int) throw()' 
1> or  'double pow(double,double)' 
1>   while trying to match the argument list '(int, size_t)' 
1>'-' : pointer can only be subtracted from another pointer 
1> error C2668: 'pow' : ambiguous call to overloaded function 
1> could be 'long double pow(long double,int) throw()' 
1> or  'long double pow(long double,long double) throw()' 
1> or  'float pow(float,int) throw()' 
1> or  'float pow(float,float) throw()' 
1> or  'double pow(double,int) throw()' 
1> or  'double pow(double,double)' 
1>   while trying to match the argument list '(int, size_t)' 
1> error C2668: 'pow' : ambiguous call to overloaded function 
1> could be 'long double pow(long double,int) throw()' 
1> or  'long double pow(long double,long double) throw()' 
1> or  'float pow(float,int) throw()' 
1> or  'float pow(float,float) throw()' 
1> or  'double pow(double,int) throw()' 
1> or  'double pow(double,double)' 
1>   while trying to match the argument list '(int, size_t)' 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

어떻게 해결할 수 있습니까? 고맙습니다.

+0

여기서'pow()'는 실제로 필요하지 않습니다. 2의 거듭 제곱을 지님에 따라 시프트를 사용할 수 있습니다. – EJP

+0

이것은 C++로 컴파일되는 C 코드입니다. 귀하의 컴파일러는 단지 약간의 해체 정체성 장애가 있습니다. 하나의 언어를 고르고 그것에 충실하십시오. –

+1

@Stefan :'#include '을'#include '으로 변경해야합니다. 그것은 완전한 인수를 취하는'pow()'의'C++ 11' 오버로딩을 픽업 할 것입니다. – Blastfurnace

답변

2

strlen 반환 유형은 C++에서 size_t입니다. 여기

pow(static_cast<size_t>(16), strlen(n) - i - 1); 

을 :

result += (n[i] - "A" + 10) 

       ^this should be 'A' 

을 메인은 void 대신 int를 반환해야합니다 : 그래서 당신은 캐스팅을 통해 모호성을 해결할 수

int main(void) { 
+1

더 흥미로운 문제는 gcc 또는 clang에서 (다른 두 개의 오류가 수정 된) 이것을 컴파일하면 오류가 없기 때문에 VC++이 여기에서 수행하고 있는지 여부를 확인하는 것입니다. –

+0

안녕하세요! 여전히 동일한 오류가 발생합니다. – Stefan

3

당신이 C로 질문을 표시하지만 질문을하면 함수를 오버로드 할 수있는 C++이기 때문에 실제로 프로그램을 C++ 프로그램으로 컴파일합니다.

경우에 따라 C++ 컴파일러에서 적절한 오버로드 된 함수 pow를 선택할 수 없습니다. 오류 메시지 지우기는 컴파일러에서 고려하는 기능을 보여줍니다. 모호함을 제거하려면

double pow(double,double) 

는 C/C++에서 main 함수는 반환 형식을 가진다 것을 고려 예를 들어 함수를 컴파일러가 함수를 사용하는 것이이 경우 다음과 같은 방법

result += (n[i] - 'a' + 10)* pow(16.0, strlen(n) - i - 1.0); 

부를 수 int. C는 + +에서 일반적으로

int main() { 

로 정의하면서 함수가

int main(void) { 

으로 정의된다 C에서

그리고 오타

if (n[i] >= 'A') 
     result += (n[i] - "A" + 10)* pow(16, strlen(n) - i - 1); 

이의 대신 있다고 생각 문자열 리터럴 "A"에는 문자 리터럴 'A'가 표시됩니다.

 double pow (double base  , double exponent); 
     float pow (float base  , float exponent); 
long double pow (long double base, long double exponent); 
    double pow (double base  , int exponent); 
long double pow (long double base, int exponent); 

당신이 16를 사용하는 첫 번째 인수는 그 기능에 사용되는 첫 번째 인수의 유형의로 변환 할 수 있습니다 :

0

C++ 98 pow 다음과 같은 오버로드 된 버전을 제공합니다. 따라서 컴파일러는 모호성을 해결할 수 없습니다. 유형을 지정하여 첫번째 인수를 명시 적으로 지정함으로써 모호성을 해결할 수 있습니다.다음 중 하나가 작동합니다 : 당신이 C++11을 사용할 수있는 경우

pow(16.0, strlen(n) - i - 1); 
pow(16.0f, strlen(n) - i - 1); 
pow(16.0l, strlen(n) - i - 1); 

, 당신은 당신의 기존 코드를 사용할 수 있습니다.

double pow (Type1 base  , Type2 exponent); 

Type1Type2arithmetic types이다 : 그것은 과부하가 있습니다.

4

C 언어에서 우리는 math.h에서 라이브러리 기능을 찾을 수 있습니다

double pow(double x, double y) ---- 1** 

C++ 언어에서 우리 수와 같은 cmath에서 오버로드 기능으로 설정합니다 :

float  pow(float base, float exp) ---- 2 
double  pow(double base, double exp) ---- 3 
long double pow(long double base, long double exp) ---- 4 
float  pow(float base, int iexp) ---- 5 
double  pow(double base, int iexp) ---- 6 
long double pow(long double base, int iexp) ---- 7 

C 스타일 프로그래밍을 사용했지만 C++ 컴파일러를 사용하여 컴파일 했으므로, 컴파일러는 따라서 같은 코드를 변경, 적절 함수 정의 위에서 언급 한 바와 같이 에 따라, 수학 라이브러리에 정의 된 함수 모호한 상태로 인수를 따라서 당신은 변환해야 직면 할 수

result += (n[i] - 'a' + 10)* pow(16.0, static_cast<double>(strlen(n) - i - 1)) 

는 또한에 주목 당신의 주어진 코드에서와 는 Perreal

if (n[i] >= 'A') 
      result += (n[i] - "A" + 10)* pow(16, strlen(n) - i - 1); 
을 언급 한 바와 같이 실수가 Ptefan이 을 언급 한 바와 같이

당신은 높은 정밀도와 정확한 결과를 필요로하는 경우도 double resultint result을 변경, 그것은 literals.change 문자열로 산술 연산을 할 수 없습니다.