我有以下功能:
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
can be int
, double
, float
, ETC....
编译器给了我'fabs' : ambiguous call to overloaded function when using templates
有什么问题以及如何解决?
Thanks.
T
can be int
, 双倍的,float
, etc.
共有三个重载std::fabs
在 C++ 中float
, double
, and long double
.
如果您尝试致电std::fabs
带有类型参数int
,由于重载歧义,您将收到编译错误。一个int
参数同等地匹配所有三个可用的重载。
您可以将参数转换为已知类型(例如double
or long double
),这将解决歧义,或者您可以将调用包装到fabs
在对整数类型参数执行歧义消除的模板中。
或者,C++ 有std::abs
,它对整数和浮点类型都重载(在<cmath>
and <cstdlib>
)。此外,如果您最近有一个实现 C++11 的标准库实现,则调用std::fabs
带有整数类型参数会自动将参数转换为类型double
,所以没有歧义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)