Вопрос по c++ – 'fabs': неоднозначный вызов перегруженной функции при использовании шаблонов

0

У меня есть следующая функция:

T* tContainer_t<T, R>::Remove( T item )
{    
    typename R::const_iterator it = std::find_if(Container.begin(), Container.end(),  [item](const T* v) { return std::fabs(*v - item) < DBL_EPSILON; });
    if (it != Container.end())
    {
        ...
    }
    else
        return NULL;
}

T может бытьint, double, float, так далее....

Компилятор дает мне'fabs' : ambiguous call to overloaded function when using templates

В чем проблема и как ее можно решить?

Благодарю.

Вы должны просто использоватьauto it, это более кратко. GManNickG
На какой тип шаблона он жалуется? rubenvb
@rubenvb<vector<double*> > или же<list<int*> > не уверен, так как компилятор не говорит явно Michael

Ваш Ответ

1   ответ
6

T can be int, double, float, etc.

Есть три перегрузкиstd::fabs в C ++ дляfloat, double, а такжеlong double.

Если вы попытаетесь позвонитьstd::fabs с аргументом типаint, вы получите ошибку компиляции из-за неоднозначности перегрузки.int Аргумент соответствует всем трем доступным перегрузкам одинаково.

Вы можете привести аргумент к известному типу (например,double или жеlong double), что решило бы двусмысленность, или вы могли быfabs в шаблоне, который выполняет устранение неоднозначности для аргументов целочисленного типа.

Кроме того, C ++ имеетstd::abs, который перегружен для целочисленных типов и типов с плавающей запятой (объявлен в<cmath> а также<cstdlib>). Кроме того, если у вас есть недавняя реализация стандартной библиотеки, которая реализует C ++ 11, вызовstd::fabs с аргументом целочисленного типа автоматически преобразует аргумент в типdouble, поэтому нет никакой двусмысленности.

Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededmustError: User Rate Limit Exceeded
Error: User Rate Limit Exceededstd::absError: User Rate Limit Exceededconditional expression of type 'void' is illegal Michael
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededstd::absError: User Rate Limit Exceeded

Похожие вопросы