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

有什么问题,如何解决?

谢谢。

4

1 回答 1

6

T可以是int, double float, 等

std::fabs在 C++ 中float,有double、 和的三个重载long double

如果您尝试std::fabs使用 type 的参数进行调用int,则会由于重载歧义而导致编译错误。一个int参数同样匹配所有三个可用的重载。

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

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

于 2012-05-24T20:10:36.780 回答