Как исправить "неоднозначный" вызов функции?
Я работаю над программой C++ для класса, и мой компилятор жалуется на "неоднозначный" вызов функции. Я подозреваю, что это потому, что есть несколько функций, определенных с различными параметрами.
Как я могу сказать компилятору, какой я хочу? Помимо исправления для конкретного случая, существует ли общее правило, такое как приведение типов, которое может решить такие проблемы?
Редактировать:
В моем случае я попытался позвонить abs()
внутри cout
заявление, переходящее в два double
s.
cout << "Amount is:" << abs(amountOrdered-amountPaid);
Edit2:
Я включаю эти три заголовка:
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
Edit3:
Я закончил программу без этого кода, но для продолжения этого вопроса я воспроизвел проблему. Дословная ошибка:
Призыв к "абс" неоднозначен.
Компилятор предлагает три версии abs
каждый из которых принимает разные типы данных в качестве параметра.
4 ответа
Что случилось, что вы включили <cstdlib>
(косвенно, так как он включен iostream
) вместе с using namespace std;
, Этот заголовок объявляет две функции в std
с именем abs()
, Один берет и возвращает long long
, а другой возвращается long
, Плюс, есть один в глобальном пространстве имен (который возвращает int
) что исходит от <stdlib.h>
,
Чтобы исправить: хорошо, abs()
что занимает двойной в <cmath>
и это на самом деле даст вам ответ, который вы хотите!
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
или что-то подобное.
Попробуйте использовать fabs
определяется в <cmath>
, Занимает float
, double
а также long double
в качестве аргументов. abs
определяется как в <cmath>
а также <cstdlib>
, Разница в том, abs(int)
, abs(long)
а также abs(long long)
определены в <cstdlib>
в то время как другие версии определены в <cmath>
,
Не уверен, почему это не вызывает int версию abs, но вы можете попробовать привести приведение типа к выражению (amountOrdered - amountPaid) как int, т.е.
cout <<"Amount is: "<< abs( (int)(amountOrdered - amountPaint) );