Как исправить "неоднозначный" вызов функции? - PullRequest
17 голосов
/ 26 сентября 2011

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

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

Редактировать:

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

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

Edit2:

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

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

using namespace std;

Edit3:

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

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

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

Ответы [ 4 ]

21 голосов
/ 26 сентября 2011

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

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

5 голосов
/ 26 сентября 2011

Функция 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 или что-то подобное.

2 голосов
/ 05 декабря 2013

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

0 голосов
/ 26 сентября 2011

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

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