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

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

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

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

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

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) );
Другие вопросы по тегам