'fabs':使用模板时对重载函数的模糊调用

Mic*_*ael 0 c++

我有以下功能:

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;
}
Run Code Online (Sandbox Code Playgroud)

T可以int,double,float,等....

编译器给了我 'fabs' : ambiguous call to overloaded function when using templates

问题是什么?如何解决?

谢谢.

Jam*_*lis 6

T可以int,双倍float,等等

有三个重载std::fabs在C++的float,doublelong double.

如果尝试std::fabs使用类型的参数进行调用int,则由于过载模糊而导致编译错误.一个int参数所有三个可用的重载的匹配同样.

您可以将参数转换为已知类型(例如doublelong double),这将解决歧义,或者您可以将调用包装在fabs对整数类型参数执行消歧的模板中.

或者,C++有std::abs,它为整数和浮点类型(在<cmath>和中声明<cstdlib>)重载.此外,如果您有最近实现C++ 11的标准库实现,则std::fabs使用整数类型参数调用将自动将参数转换为type double,因此不存在歧义.