Как разрешить "fpclassify": неоднозначный вызов перегруженной функции - PullRequest
1 голос
/ 07 мая 2020

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

Код ошибки - C2668, и его описание - «fpclassify»: неоднозначный вызов перегруженной функции. Проект - «Выполнить моделирование», а файл - corecrt_math.h в строке 415.

Честно говоря, я Я не уверен, что какая-либо информация, которую я предоставил, может быть полезной, и я не уверен, какую информацию предоставить. Может быть, было бы лучше, если бы вы могли задать мне несколько вопросов, и я смогу ответить на них в меру своих Я приложил снимок экрана с моей Visual Studio 19.

Visual Studio
(Щелкните изображение, чтобы увеличить)

Воспроизводимо пример ( демо )

#include <cmath>

int main() {
    std::isnan(1);
}

Ожидаемый результат: он компилируется.

1 Ответ

1 голос
/ 07 мая 2020

Вы, наверное, как-то скормили std::fpclassify целое число. В Visual Studio есть проблема с целочисленными перегрузками для функций <cmath>, которая проявляется, как и в вашем случае, вместо преобразования целого числа в double в соответствии с:

c .math .syn # 2.2 :

[…], если какой-либо аргумент типа arithmeti c, соответствующий параметру double, имеет тип double или целочисленный тип , тогда все аргументы типа arithmeti c, соответствующие параметрам double, фактически приводятся к double.

Я написал отчет об ошибке для std::signbit, но это то же самое для всех <cmath> функций, которые я тестировал, и std::fpclassify является одной из них - и он используется внутри многих других cmath функций.

Строка 415 в corecrt_math.h находится внутри isnan функция, которая вызывает fpclassify изнутри.

Действия по устранению проблемы:

  • При создании проекта вы получите список ошибки в поле Список ошибок . Найдите строки, показывающие see reference to function template instantiation 'bool isnan<int>(_Ty) noexcept' being compiled или аналогичные. Часть <int> может быть любого целочисленного типа.
  • Дважды щелкните эту строку, и IDE должна поместить курсор на вызов isnan, который выполняется с целым числом.
  • Замените isnan(integer) вызов с isnan(static_cast<double>(integer)).
  • Повторите эти шаги для любых других cmath функций, вызывающих проблемы.

Примечание: использование isnan с целыми числами бессмысленно. isnan(integer) всегда будет возвращать false, поэтому компилятор с включенной оптимизацией должен заменить весь вызов на false.

...