Как исправить "неоднозначный" вызов функции?
Я работаю над программой на С++ для класса, и мой компилятор жалуется на "неоднозначный" вызов функции. Я подозреваю, что это связано с тем, что существует несколько функций, определенных с разными параметрами.
Как я могу сообщить компилятору, какой из них я хочу? Помимо конкретного случая, существует ли общее правило, такое как 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) );