ошибка: вызов перегруженного ‘abs (double)’ неоднозначен

#c

#c

Вопрос:

Я искал ответы, но не могу найти ни одного, который соответствовал бы моему очень простому случаю.

С какой стати abs работает только с целыми числами? Я не могу выполнить эту операцию?

 // Example program
#include <iostream>

using namespace std;

int main()
{
    float someVariable = abs(-4.22);
    cout << someVariable;
}
  

Обратите внимание, я использую http://cpp.sh чтобы проверить это.

Ответ №1:

abs имеет разные реализации в зависимости от того, как он включен.

Чтобы получить плавающую точку, вам нужно

 #include <cmath>
  

Результирующая программа

 #include <iostream>
#include <cmath>
using namespace std;

int main()
{
    float someVariable = abs(-4.22);
    cout << someVariable;
}
  

Ссылка cppreference abs(float)

Ответ №2:

Вам нужно включить математическую библиотеку, например, так:

 #include <cmath>
  

Комментарии:

1. Ну ладно, я должен был #include <math.h> , чтобы это сработало. Спасибо за вашу помощь. Но я почти уверен, что abs () можно использовать для действительных чисел, нет (я читаю, что в C нет, но C да)!?

2. Да, исправьте @aName, смотрите мое обновление, кстати, вы задали хороший вопрос, 1!

3.Я не думаю, что вам нужно, fabs если вы включите math.h (согласно этому, оба <cxxx> и <xxx.h> должны объявлять одни и те же имена, просто в разных namespaes). Here abs from math.h , похоже, отлично работает с реальными числами.

4. Я тоже так подумал @HolyBlackCat, но, пожалуйста, взгляните на мое первое живое демо. Там я включил <math.h> . Изменение fabs() на abs() приводит к ошибке!

5. Любопытно, что в моей рабочей среде простое включение math.h и abs(-4.22) работало просто отлично!!

Ответ №3:

std::abs принимает любой из:

Однако до C 17, если вы не #include <cmath> тогда, были доступны только целочисленные перегрузки (первые три из перечисленных). Вы передаете float , который одинаково хорошо преобразуется в любые три из них, поэтому компилятор не может определить, какой из них вы хотели.

Если вы хотели перегрузить целое число, вы бы использовали приведение к int , long или long long в зависимости от обстоятельств.

Но вы этого не делаете: вы хотите вызвать float перегрузку, поэтому перенесите ее в область видимости с помощью #include <cmath> , и тогда она должна быть выбрана автоматически, потому что вы передаете float .

На самом деле, вам просто повезло, что доступны даже целочисленные перегрузки, потому что вы никогда не #include изменяли <cstdlib> ; <iostream> должно быть, так случилось, что ваш набор инструментов сделал это за вас. Всегда включайте соответствующие заголовки в соответствии с документацией.

Ответ №4:

abs() объявлен в заголовке cmath. Итак, если вы хотите использовать abs(), вам нужно включить cmath в свой код следующим образом :

 #include <iostream>
#include <cmath>
using namespace std;

int main()
{
    float someVariable = abs(-4.22);
    cout << someVariable;
}
  

Примечание: Начиная с C 11 и более версий, мы можем использовать abs () следующим образом :

 double abs (double x);
float abs (float x);
long double abs (long double x);
double abs (T x);           // additional overloads for integral types
  

Ссылка :http://www.cplusplus.com/reference/cmath/abs /