Как исправить "неоднозначный" вызов функции?

Я работаю над программой на С++ для класса, и мой компилятор жалуется на "неоднозначный" вызов функции. Я подозреваю, что это связано с тем, что существует несколько функций, определенных с разными параметрами.

Как я могу сообщить компилятору, какой из них я хочу? Помимо конкретного случая, существует ли общее правило, такое как typecasting, которое может решить эти проблемы?

Edit:

В моем случае я попытался вызвать abs() внутри оператора cout, передав два double s.

cout << "Amount is:" << abs(amountOrdered-amountPaid);

Edit2:

Я включаю эти три заголовка:

#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

Edit3:

Я закончил программу без этого кода, но в интересах выполнения этого вопроса я воспроизвел проблему. Дословная ошибка:

Вызов "abs" неоднозначен.

Компилятор предлагает три версии abs, каждый из которых использует разные типы данных в качестве параметра.

Ответы

Ответ 1

Случилось так, что вы включили <cstdlib> (косвенно, так как он включен в iostream) вместе с using namespace std;. Этот заголовок объявляет две функции в std с именем abs(). Один берет и возвращает long long, а другой возвращает long. Кроме того, там содержится в глобальном пространстве имен (который возвращает int), который исходит от <stdlib.h>.

Чтобы исправить: ну, abs(), который принимает double, находится в <cmath>, и это действительно даст вам ответ, который вы хотите!

Ответ 2

Функция abs, включенная <cstdlib>, перегружена для int и long и long long. Поскольку вы даете double в качестве аргумента, компилятор не имеет точной подгонки, поэтому он пытается преобразовать double в тип, который принимает abs, но он не знает, следует ли пытаться его преобразовать до int, long или long long, следовательно, это неоднозначно.

Но вы, вероятно, действительно хотите, чтобы abs принял double и возвращает double. Для этого вам нужно включить <cmath>. Поскольку аргумент double точно соответствует, компилятор не будет жаловаться.

Кажется, что <cstdlib> включается автоматически, когда вы включаете другие заголовки, которых не должно быть. Компилятор должен был указать error: ‘abs’ was not declared in this scope или что-то подобное.

Ответ 3

Попробуйте использовать fabs, определенный в <cmath>. В качестве аргументов требуется float, double и long double. abs определяется как в <cmath>, так и <cstdlib>. Разница abs(int), abs(long) и abs(long long) определены в <cstdlib>, а другие версии определены в <cmath>.

Ответ 4

Не уверен, почему это не вызывает int-версию abs, но вы можете попробовать выполнить листинг выражения (amountOrdered - amountPaid) как int i.e.

cout <<"Amount is: "<< abs( (int)(amountOrdered - amountPaint) );