4 Answers 4

string::size() returns size_t , and sqrt doesn’t accept it in any of its versions. So the compiler has to cast, and cannot choose to what — all of them are OK. You have to put explicit cast:

The problem is that in C++, there are three functions named sqrt — one taking in a float , one taking a double , and one taking a long double . When you try calling

The compiler tries to determine which of these functions you want to call. Since aux.size() returns a string::size_type , which is neither a float , double , nor long double , it tries to see if string::size_type is implicitly convertible to any of these three. But since string::size_type is convertible to all three of these types, the compiler marks the call as ambiguous, since it’s unclear which of the conversions you want to do.

To fix this, you can explicitly cast aux.size() to the type that you want. For example:

This makes the call unambiguously match one of the two functions. Depending on the precision you want, you can choose any of the three overloads. Since you’re just casting back to an int , it’s probably fine to cast to a float here.

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.

Those are all the errors.

How can I fix this? Thank you.

4 Answers 4

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

and main should return int instead of void :

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

In this case the compiler would use function

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

In C the function is defined as

while in C++ it is usually defined as

And I think there is a typo

Instead of the string literal "A" there shall be character literal ‘A’

In C language we can find library function under math.h:

In C++ language we able to have set of overloaded functions under cmath such as:

Since you were using C style programming but compiled using C++ compiler,compiler might face with ambiguity states with defined function in math library,therefore you should convert your argument appropriately according to function definition 1 as mentioned above,therefore change your code as,

ALSO NOTED with in your given code snippet there is a mistake as Perreal noted

Я получаю ошибку, например..

и когда я пытаюсь вызвать function(1.2,2) или function(1,2.2) , он печатает как " функция int"

Пожалуйста, уточните, когда вызывается function(float y,float w) ?

Посмотрите сообщение об ошибке из gcc:

Вызов любой из функций потребует усечения, поэтому ни один из них не является предпочтительным по сравнению с другим. Я подозреваю, что вы действительно хотите void function(double y,double w) . Помните, что в C/С++ тип с плавающей запятой по умолчанию для литералов и передачи параметров — double, NOT float.

UPDATE

Если вы действительно не хотите менять подпись функции с float на double, вы всегда можете использовать литералы, которые напечатаны как float. Если вы добавите суффикс f к номерам с плавающей запятой, они будут напечатаны с плавающей запятой.

Вашими примерами будут function(1.2f, 2f) и function(1, 2.2f) .

Что такое перегрузка оператора?

Почему две версии function в OP допускаются к существованию?

Обратите внимание, что они принимают разные типы параметров функций ( int и float ) и, следовательно, квалифицируются как допустимые перегрузки функций.

Что такое разрешение перегрузки?

Это процесс выбора наиболее подходящей функции/оператора с помощью реализации компилятора. Если существует наилучшая жизнеспособная функция и она уникальна, разрешение перегрузки преуспевает и приводит к ее результату. В противном случае разрешение перегрузки завершается с ошибкой, и вызов обрабатывается как плохо сформированный, а компилятор предоставляет диагностику. Компилятор использует неявная последовательность преобразований, чтобы найти наилучшую функцию соответствия.

С++ 03 Стандарт 13.3.3.1 Неявные преобразования:

Неявная последовательность преобразования представляет собой последовательность преобразований, используемых для преобразования аргумента в вызов функции к типу соответствующего параметра вызываемой функции.

Неявные последовательности преобразования могут быть одной из следующих категорий:

  • Стандартная последовательность преобразования (13.3.3.1.1)
  • Пользовательская последовательность преобразований (13.3.3.1.2)
  • Последовательность преобразования многоточия (13.3.3.1.3)

Обратите внимание, что каждый из них оценивается для определения наилучшей жизнеспособной функции. Лучшая жизнеспособная функция — это та, у которой параметры имеют либо более совершенные, либо равноценные неявные последовательности преобразований, чем все другие жизнеспособные функции. Стандартная информация подробно описана в каждом из этих разделов. Стандартная последовательность преобразования имеет отношение к этому случаю, она суммируется как:

С достаточным фоном для перегрузки разрешения.
рассмотрим примеры кода в OP:

Важное правило: 1.2 и 2.2 являются литералами, и они рассматриваются как тип данных double .

Во время отображения неявных преобразований:
Оба литерала параметров функции с типом double нуждаются в ранге преобразования, чтобы либо вызвать версию float , либо int , и ни одна из них не лучше, чем другая, они точно совпадают с рангом конверсии. Компилятор не может определить наилучшее жизнеспособное соответствие, и он сообщает о двусмысленности.

При отображении последовательности неявных преобразований:
Один из параметров функции 2 имеет точное соответствие с версией функции int , а другой 1.2 имеет ранг преобразования. Для функции, которая принимает float в качестве параметров, неявные последовательности преобразования для обоих параметров имеют ранг преобразования.
Таким образом, функция, которая принимает версию int , лучше, чем версия float , и является наилучшим совпадением и получает вызов.

Как разрешить перегрузку ошибок неоднозначности?

Если вы не хотите, чтобы неявное преобразование последовательности преобразований выбрасывало вас, просто предоставляйте функции и вызывайте их таким образом, чтобы параметры были точно совпадают. Поскольку точное совпадение очков над всеми остальными, у вас есть определенная гарантия того, что ваша желаемая функция будет вызвана. В вашем случае есть два способа сделать это:

Решение 1:

Вызвать функцию так, чтобы параметры были точно соответствуют доступным функциям.

Так как 1.2f и 2.2f рассматриваются как типы float , они точно соответствуют версии функции float .

Решение 2:

Предоставить функцию перегрузки, которая точно соответствует типу параметра в вызываемой функции.

Так как 1.2 и 2.2 рассматриваются как double , вызываемая функция точно соответствует этой перегрузке.