我有以下功能:
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
问题是什么?如何解决?
感谢。
答案 0 :(得分:6)
T
可以是int
,双倍,float
等。
{+ 1}},std::fabs
和float
在C ++中有三次double
重载。
如果您尝试使用long double
类型的参数调用std::fabs
,则由于过载模糊而导致编译错误。 int
参数同等地匹配所有三个可用重载。
您可以将参数转换为已知类型(例如int
或double
),这将解决歧义,或者您可以将调用包装在执行的模板中long double
消除整数类型参数的消歧。
或者,C ++有fabs
,它对于整数和浮点类型都是重载的(在std::abs
和<cmath>
中声明)。此外,如果您有最近实现C ++ 11的标准库实现,则使用整数类型参数调用<cstdlib>
会自动将参数转换为类型std::fabs
,因此不存在歧义。< / p>