2014-07-15 35 views
6

Tôi đang gặp một số sự cố khi chạy mã sau. Tôi nhận được điều này: lỗi C2668: 'pow': cuộc gọi mơ hồ đến chức năng quá tải. Tôi đã cố gắng để tự đúc các đối số cho loại appropiate bằng cách sử dụng static_cast, tuy nhiên tôi nghĩ rằng tôi nhận được một số lỗi con trỏ ?!Cuộc gọi mơ hồ đến chức năng quá tải 'pow'

Chương trình nên chuyển đổi một số từ cơ sở 16 căn 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(); 
} 

Đó là tất cả các lỗi.

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

Làm cách nào để khắc phục sự cố này? Cảm ơn bạn.

+0

Bạn không thực sự cần 'pow()' ở tất cả ở đây, bạn có thể sử dụng thay đổi, khi bạn đang exponentiating một sức mạnh của hai. – EJP

+0

Đây là mã C được biên dịch thành C++. Trình biên dịch của bạn chỉ có một chút rối loạn nhận dạng phân ly. Chọn một ngôn ngữ và dính vào nó. –

+1

@Stefan: Bạn nên thử thay đổi dòng có nội dung '#include ' thành '#include '. Điều đó có thể nhận quá tải 'C++ 11' của' pow() 'có các đối số không tách rời. – Blastfurnace

Trả lời

2

strlen loại trả về là size_t bằng C++. Vì vậy, bạn có thể giải quyết sự mơ hồ qua đúc:

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

cũng ở đây:

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

       ^this should be 'A' 

và chính nên trả lại int thay vì void:

int main(void) { 
+1

Vấn đề thú vị hơn là liệu VC++ đang làm gì ở đây là phù hợp, vì không có lỗi nếu bạn biên dịch (với hai lỗi khác cố định) trên gcc hoặc clang. –

+0

Xin chào! Tôi vẫn nhận được các lỗi tương tự. – Stefan

3

Mặc dù bạn đánh dấu câu hỏi của bạn như là một C câu hỏi bạn thực sự biên dịch chương trình của bạn như là một chương trình C++ vì nó là C++ cho phép các chức năng quá tải.

Trong trường hợp của bạn trình biên dịch C++ không thể chọn một hàm chức năng nạp chồng thích hợp. Thông báo lỗi rõ ràng cho thấy những gì các chức năng trình biên dịch xem xét. Để loại bỏ sự mơ hồ, bạn có thể gọi hàm ví dụ theo cách sau

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

Trong trường hợp này trình biên dịch sẽ sử dụng chức năng

double pow(double,double) 

Đi vào tài khoản đó trong C/C++ chức năng chính có trách nhiệm kiểu trả về int.

Trong C hàm được định nghĩa là

int main(void) { 

trong khi trong C++ chúng ta thường được định nghĩa như

int main() { 

Và tôi nghĩ có một typo

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

Thay vì chuỗi chữ "A" sẽ có ký tự 'A'

0

C++ 98 cung cấp các phiên bản quá tải sau pow:

 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); 

Đối số đầu tiên bạn đang sử dụng, 16, có thể được chuyển đổi sang bất kỳ các loại của các đối số đầu tiên được sử dụng trong những chức năng. Do đó, trình biên dịch không thể giải quyết sự mơ hồ. Bạn có thể giải quyết sự mơ hồ bằng cách rõ ràng với đối số đầu tiên, bằng cách xác định loại của nó.Bất kỳ một trong những điều sau đây sẽ hoạt động:

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

Nếu bạn có thể sử dụng C++11, bạn có thể sử dụng mã hiện tại của mình. Nó có một tình trạng quá tải:

double pow (Type1 base  , Type2 exponent); 

nơi Type1Type2arithmetic types.

4

Trong C ngôn ngữ chúng ta có thể tìm thấy chức năng thư viện dưới math.h:

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

Trong C++ ngôn ngữ chúng ta có thể đã thiết lập các chức năng quá tải dưới cmath như:

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 

Vì bạn đang sử dụng lập trình kiểu C nhưng được biên dịch bằng trình biên dịch C++, trình biên dịch có thể phải đối mặt với các quốc gia nhập nhằng với chức năng định nghĩa trong thư viện toán học, do đó bạn nên chuyển đổi tranh luận của bạn một cách thích hợp theo định nghĩa hàm như đã đề cập ở trên, do đó thay đổi mã của bạn như,

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

cũng lưu ý với trong đoạn mã cho bạn có là một sai lầm như Perreal lưu ý

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

bạn không thể làm phép tính số học với chuỗi literals.change nó như Ptefan nêu , cũng thay đổi int result-double result nếu bạn cần độ chính xác cao và kết quả chính xác.

Các vấn đề liên quan