簡體   English   中英

對重載函數'pow'的模糊調用

[英]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);

其中Type1Type2算術類型

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM