Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对重载函数的调用不明确';战俘';_C++_Function_Overwrite_Pow - Fatal编程技术网

C++ 对重载函数的调用不明确';战俘';

C++ 对重载函数的调用不明确';战俘';,c++,function,overwrite,pow,C++,Function,Overwrite,Pow,我在运行以下代码时遇到一些问题。我发现:错误C2668:“pow”:对重载函数的调用不明确。我已经尝试使用static_cast手动将参数转换为appropiate类型,但是我认为我得到了一些指针错误 程序应将数字从基数16转换为基数10 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h&

我在运行以下代码时遇到一些问题。我发现:错误C2668:“pow”:对重载函数的调用不明确。我已经尝试使用static_cast手动将参数转换为appropiate类型,但是我认为我得到了一些指针错误

程序应将数字从基数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();
}

我怎样才能解决这个问题?谢谢。

< P>代码>斯特林< /Cord>返回类型是C++中的代码> siZixt < /Cord>。因此,您可以通过强制转换来解决歧义:

pow(static_cast<size_t>(16), strlen(n) - i - 1);
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 ) {
int main() {
在C++中,它通常定义为

int main( void ) {
int main() {
我认为有一个拼写错误

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

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
是。

C语言中,我们可以在math.h下找到库函数:

C++语言中,我们可以在cmath下设置一组重载函数,例如:

由于使用C++编程,但使用C++编译器编译,编译器可能会遇到在函数库中定义函数的模糊状态,因此,您应该根据函数定义<强>>1 <强>适当地转换参数,因此将代码更改为

result += (n[i] - 'a' + 10)* pow(16.0, static_cast<double>(strlen(n) - i - 1))
不能对字符串文本进行算术运算。请按照前面提到的方法进行更改 ,也会改变
int-result
double-result
,如果您需要高精度和准确的结果。

更有趣的问题是VC++在这里所做的是否符合要求,因为如果您在gcc或clang上编译它(其他两个错误已修复),则不会出现错误。您根本不需要
pow()
,你可以使用移位,因为你在幂幂二。这是C代码编译为C++。你的编译器只是有一点分离的身份混乱。选择一种语言并坚持使用。@Stefan:你应该试着把写有
\include
的行改为
\include
。这可能会导致
C++11
重载
pow()
,该重载采用整型参数。@blastburne很棒的提示!为什么不回答呢?
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
result += (n[i] - 'a' + 10)* pow(16.0, static_cast<double>(strlen(n) - i - 1))
if (n[i] >= 'A')
            result += (n[i] - "A" + 10)* pow(16, strlen(n) - i - 1);