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

时间:2012-05-24 20:00:47

标签: 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;
}

T可以是intdoublefloat等等。

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

问题是什么?如何解决?

感谢。

1 个答案:

答案 0 :(得分:6)

  

T可以是int,双倍,float等。

{+ 1}},std::fabsfloat在C ++中有三次double重载。

如果您尝试使用long double类型的参数调用std::fabs,则由于过载模糊而导致编译错误。 int参数同等地匹配所有三个可用重载。

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

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