[英]Ambiguous call to overloaded function 'pow'
我在運行以下代碼時遇到了一些問題。 我得到了這個:錯誤C2668:'pow':對重載函數的模糊調用。 我試圖使用static_cast手動將參數轉換為適當的類型,但是我想我得到一些指針錯誤?!
該程序應將數字從基數16轉換為基數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();
}
這些都是錯誤。
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 ==========
我怎樣才能解決這個問題? 謝謝。
strlen
返回類型是C ++中的size_t
。 所以你可以通過鑄造解決歧義:
pow(static_cast<size_t>(16), strlen(n) - i - 1);
也在這里:
result += (n[i] - "A" + 10)
^ this should be 'A'
main應該返回int
而不是void
:
int main(void) {
雖然您將問題標記為C問題,但實際上您將程序編譯為C ++程序,因為它是允許重載函數的C ++。
在您的情況下,C ++編譯器無法選擇適當的重載函數pow。 錯誤消息clear顯示編譯器考慮的功能。 要消除歧義,您可以通過以下方式調用該函數
result += (n[i] - 'a' + 10)* pow( 16.0, strlen(n) - i - 1.0 );
在這種情況下,編譯器將使用函數
double pow(double,double)
考慮到在C / C ++函數中main應該有返回類型int
。
在C中,函數定義為
int main( void ) {
而在C ++中,它通常被定義為
int main() {
我認為有一個錯字
if (n[i] >= 'A')
result += (n[i] - "A" + 10)* pow(16, strlen(n) - i - 1);
而不是字符串文字“A”應該有字符文字'A'
在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 ++編譯器編譯,編譯器可能會遇到數學庫中具有已定義函數的歧義狀態,因此您應該根據上面提到的函數定義1適當地轉換您的參數,因此將代碼更改為,
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所提到的那樣改變它 ,如果你需要高精度和准確的結果,也可以將int result
改為double result
結果。
C ++ 98提供了以下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);
您正在使用的第一個參數16
可以轉換為這些函數中使用的第一個參數的任何類型。 因此,編譯器無法解決歧義。 您可以通過指定其類型來明確第一個參數來解決歧義。 以下任何一項都應該有效:
pow(16.0, strlen(n) - i - 1);
pow(16.0f, strlen(n) - i - 1);
pow(16.0l, strlen(n) - i - 1);
如果您能夠使用C++11
,則可以使用現有代碼。 它有一個過載:
double pow (Type1 base , Type2 exponent);
其中Type1
和Type2
是算術類型 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.