我有一个自定义数据类型,实际上可以是float
or double
。在除 OSX 之外的每个操作系统上,我都能够成功构建此 C++11 模板:
#include <cmath>
#include <cstdlib>
#include <cstdint>
template< class REAL_T >
inline REAL_T inhouse_abs(REAL_T i_val)
{
return std::abs((REAL_T)i_val);
}
int main()
{
int32_t ui = 2;
inhouse_abs(ui);
return 0;
}
但是,clang 6.0 (3.5 LLVM) 报告了不明确的函数调用。如果我改变abs
to fabs
,该错误在 OSX 上已解决,但现在在我的 Linux clang、gcc 和 Visual Studio 上出现相同的错误。
使用 fabs 在 Visual Studio 上出错:
349 error C2668: 'fabs' : ambiguous call to overloaded function
UPDATE
这个例子是在我们的 OS X 系统上编译的,尽管在nearly相同的项目却没有。解决方案包括<cstdlib>
明确地在源中,而不是在另一个标头中。原因尚不清楚,但似乎是 xcode/clang 没有正确遵循我们的标头包含。
问题是libc++
不完全符合 C++11 的积分重载cmath 中的 std::abs:
double fabs( Integral arg ); (7) (since C++11)
包括cstdlib解决了您的问题,因为该标头具有专门针对整数类型的重载。
供参考 C++11 标准部分草案26.8
[c.math]段落11
says:
此外,应有足够的额外过载以确保:
并包括以下项目:
- 否则,如果对应于 double 参数的任何参数具有 double 类型或整数类型,则对应于的所有参数
double 参数被有效地转换为 double。
这种情况很可能会改变,因为LWG 活动问题 2192:std::abs(0u) 的有效性和返回类型不清楚。我猜libc++
选择不提供重载cmath
由于本缺陷报告中提出的问题。
See std::abs(0u) 格式错误吗?有关此的更多详细信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)