Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ambiguous call to overloaded function 'pow'

I'm having some problems runnning the following code. I got this: error C2668: 'pow' : ambiguous call to overloaded function. I've tried to manually cast the arguments to the appropiate type using static_cast, however I think I get some pointer errors?!

The program should convert a number from base 16 to base 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();
}

Those are all the errors.

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

How can I fix this? Thank you.

like image 928
Stefan Avatar asked Jul 15 '14 04:07

Stefan


People also ask

What is ambiguous function call?

You cannot override one virtual function with two or more ambiguous virtual functions. This can happen in a derived class that inherits from two nonvirtual bases that are derived from a virtual base class.


2 Answers

strlen return type is size_t in C++. So you can resolve the ambiguity via casting:

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

also here:

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

                  ^ this should be 'A'

and main should return int instead of void:

int main(void) { 
like image 195
perreal Avatar answered Sep 28 '22 09:09

perreal


Though you marked your question as a C question you actually compile your program as a C++ program because it is C++ that allows to overload functions.

In your case the C++ compiler is unable to select an appropriate overloaded function pow. The error message clear shows what functions the compiler considers. To remove the ambiguity you could call the function for example the following way

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

In this case the compiler would use function

double pow(double,double)

Take into account that in C/C++ function main shall have return type int.

In C the function is defined as

int main( void ) {

while in C++ it is usually defined as

int main() {

And I think there is a typo

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

Instead of the string literal "A" there shall be character literal 'A'

like image 26
Vlad from Moscow Avatar answered Sep 28 '22 09:09

Vlad from Moscow