2014-07-15 51 views
6

Aşağıdaki kodun çalıştırılmasıyla ilgili bazı sorunlar yaşıyorum. Bunu elde ettim: C2668 hatası: 'pow': aşırı yüklenmiş fonksiyona muğlak çağrı. Argümanları static_cast kullanarak uygun tipte el ile yapmaya çalıştım, ancak bazı işaretçi hataları aldığımı düşünüyorum ?!Aşırıya çalışma işlevi 'pow' için belirsiz çağrı

programı 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(); 
} 

Bunların hepsi hatalardır dayandırmak tabanından 16 arasında bir sayı dönüştürmek gerekir.

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 ========== 

Bunu nasıl düzeltebilirim? Teşekkür ederim. C++ içinde size_t döndürme türü

+0

Gerçekten gerekmez 'pow()' Eğer ikisinin bir güç exponentiating konum olarak burada hiç, sen vardiya kullanabilirsiniz. – EJP

+0

Bu, C++ olarak C kodu derlenmiş edilmektedir. Derleyicinin sadece küçük bir ayrışma kimliği bozukluğu var. Bir dil seçin ve ona yapıştırın. –

+1

@Stefan: #include 'satırını #include ' olarak değiştirmeyi deneyin. Bu entegre bağımsız değişkenleri alır POW() '' ve 'C++ 11' aşırı almak olabilir. – Blastfurnace

cevap

2

strlen. Ayrıca burada

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

:

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

       ^this should be 'A' 

ve ana void yerine int dönmelidir: Yani döküm yoluyla belirsizliği çözebilirsiniz

int main(void) { 
+1

Daha ilginç olan konu, VC++ 'nın burada yapıp yapmadığıdır, çünkü gcc veya clang'da (diğer iki hatayı düzeltmek suretiyle) derlerseniz hata olmaz. –

+0

Merhaba! Hala aynı hataları alıyorum. – Stefan

3

bir C sorunuzu işaretlenmiş olsa programın bir C++ programı olarak derlediğini çünkü C++ 'ın aşırı yüklenme fonksiyonlarına izin vermesini sağlar.

Durumunuzda, C++ derleyici uygun bir aşırı yüklenmiş işlev gçünü seçemiyor. Hata mesajı, derleyicinin hangi işlevleri göz önünde bulundurduğunu gösterir. Belirsizliği ortadan kaldırmak için,

double pow(double,double) 

C/C++ fonksiyon ana dönüş türü olmalıdır dikkate alın örneğin fonksiyonu derleyici fonksiyonu kullanmak Bu durumda aşağıdaki şekilde

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

diyebiliriz int. C++ içinde genellikle

int main() { 

olarak tanımlanır iken fonksiyon

int main(void) { 

olarak tanımlanır C

Ve ben bir yazım hatası

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

ait Yerine olduğunu düşünüyorum dize değişmez "A" karakter değişkeni olacaktır '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); 

Eğer 16 kullandığınız İlk argüman, bu fonksiyonlarda kullanılan ilk bağımsız değişkenlerin türlerinin herhangi dönüştürülebilir:

0

C++ 98 pow aşağıdaki aşırı sürümlerini sağlar. Bu nedenle, derleyici belirsizliği çözemez. Türünü belirterek ilk argümanla açık olarak belirsizliği çözebilirsiniz.Aşağıdakilerden herhangi biri çalışmalıdır: Eğer C++11 kullanmak mümkün değilse

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

, mevcut kodu kullanabilirsiniz.

double pow (Type1 base  , Type2 exponent); 

nerede Type1 ve Type2arithmetic types şunlardır: Bu bir aşırı vardır.

4

C dilinde biz math.h altında kütüphane işlevi bulabilirsiniz:

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

C++ dilinde biz mümkün gibi CMATH altında aşırı fonksiyonları belirledik için:

C tarzı programlama kullanarak ancak C++ derleyicisi kullanılarak derlenmiştir yana
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 

, derleyici, bu nedenle gibi kodunu değiştirmek, uygun fonksiyon tanımı yukarıda da belirtildiği gibi göre, matematik kütüphanesinde tanımlı fonksiyonu ile belirsizlik durumları ile argüman nedenle dönüştürmek gerekir karşılaşabileceği

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

AYRICA kaydetti size verilen kod parçacığı içinde olan Perreal

if (n[i] >= 'A') 
      result += (n[i] - "A" + 10)* pow(16, strlen(n) - i - 1); 
belirtildiği gibi bir yanlışlık var Ptefan belirtildiği gibi

Eğer yüksek hassasiyet ve doğru sonuçlar gerektiğinde de double result için int result değiştirmek, bunun literals.change dize ile aritmetik işlemleri yapamaz.