std :: abs для «unsigned long long int» тип данных

Почему я должен получить эту ошибку

 C2668: 'abs' : ambiguous call to overloaded function

Для простого кода, подобного этому

#include <iostream>
#include <cmath>
int main()
{
unsigned long long int a = 10000000000000;
unsigned long long int b = 20000000000000;
std::cout << std::abs(a-b) << "\n";   // ERROR
return 0;
}

Ошибка по-прежнему присутствует после удаления std::, Однако, если я использую int Тип данных (с меньшими значениями) нет проблем.

Традиционное решение — проверить это вручную

std::cout << (a<b) ? (b-a) : (a-b) << "\n";

Это единственное решение?

4

Решение

Проверка кажется единственным действительно хорошим решением. Альтернативы требуют, чтобы тип, больше чем Ваш и нестандартное расширение, использовал это.

Вы можете пойти с решениями, приводящими к подписанному длинному, если ваш диапазон соответствует. Я бы вряд ли предложил такой способ, особенно если реализация находится в функции, которая делает только это.

10

Другие решения

Вы в том числе <cmath> и, таким образом, используя «плавающая запятая abs».

«целое число abs«объявлен в <cstdlib>,

Тем не менее, нет перегрузки для unsigned long long int (и то и другое a а также b являются, таким образом, a-b тоже), а перегрузка для long long int существует только с C ++ 11.

5

Во-первых, вам нужно включить правильный заголовок. Как указывает gx_, <cmath> имеет abs с плавающей точкой, и на моем компиляторе он фактически компилируется, но результат, вероятно, не тот, который вы ожидали:

1.84467e+19

Включают <cstdlib> вместо. Теперь ошибка:

main.cpp:7:30: error: call of overloaded ‘abs(long long unsigned int)’ is ambiguous
main.cpp:7:30: note: candidates are:
/usr/include/stdlib.h:771:12: note: int abs(int)
/usr/include/c++/4.6/cstdlib:139:3: note: long int std::abs(long int)
/usr/include/c++/4.6/cstdlib:173:3: note: long long int __gnu_cxx::abs(long long int)

Как видите, нет unsigned перегрузка этой функции, потому что вычисление абсолютного значения чего-то типа unsigned не имеет смысла.

Я вижу ответы, предлагающие вам сыграть unsigned введите подписанный, но я считаю, что это dagereous, если вы действительно не знаете, что делаете!
Позвольте мне сначала спросить, каков ожидаемый диапазон значений a а также b что вы собираетесь оперировать? Если оба ниже 2^63-1 Я настоятельно рекомендую просто использовать long long int, Если это не так, позвольте мне отметить, что ваша программа для значений:

a=0, b=1

а также

a=2^64-1, b=0

будет производить точно такой же результат, потому что на самом деле вам нужно 65 бит, чтобы представить любой возможный результат разницы 2 64-битных значений. Если вы можете подтвердить, что это не будет проблемой, используйте приведенный состав как предложено. Однако, если вы не знаете, возможно, вам придется переосмыслить то, чего вы на самом деле пытаетесь достичь.

1

Поскольку до C ++ с C вы привыкли использовать abs, fabs, labs для каждого отдельного типа, c ++ допускает перегрузку abs, в этом случае он не понимает или не доволен вашей перегрузкой.

использование labs(a-b) видя, как вы используете длинные, это должно решить вашу проблему.

-2
По вопросам рекламы [email protected]