当我编译以下代码时:
#include <boost/numeric/interval.hpp>
#include <complex>
int main(){
std::complex<boost::numeric::interval<double> > my_interval(1,1);
my_interval *= my_interval;
return 0;}
使用
g++ -std=c++14 main.cpp
或
clang++ -std=c++14 main.cpp
我有两种不同的行为。 g ++可以很好地编译,而clang ++则不能编译,因为对
的调用std::enable_if<std::is_arithmetic<_A1>::value, bool>::type
禁用某些必需的功能。有简单的解决方法吗?我在做错什么吗?
版本:
g ++(MacPorts gcc5 5.5.0_1)5.5.0
Apple LLVM版本8.1.0(clang-802.0.38)
完全错误:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/complex:599:9: error:
no matching function for call to 'isnan'
if (isnan(__x) && isnan(__y))
^~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/complex:312:27: note:
in instantiation of function template specialization
'std::__1::operator*<boost::numeric::interval<double,
boost::numeric::interval_lib::policies<boost::numeric::interval_lib::rounded_math<double>,
boost::numeric::interval_lib::checking_strict<double> > > >' requested
here
*this = *this * complex(__c.real(), __c.imag());
^
main.cpp:6:15: note: in instantiation of function template specialization
'std::__1::complex<boost::numeric::interval<double,
boost::numeric::interval_lib::policies<boost::numeric::interval_lib::rounded_math<double>,
boost::numeric::interval_lib::checking_strict<double> > >
>::operator*=<boost::numeric::interval<double,
boost::numeric::interval_lib::policies<boost::numeric::interval_lib::rounded_math<double>,
boost::numeric::interval_lib::checking_strict<double> > > >' requested
here
my_interval *= my_interval;
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:424:25: note:
candidate template ignored: disabled by 'enable_if' [with _A1 =
boost::numeric::interval<double,
boost::numeric::interval_lib::policies<boost::numeric::interval_lib::rounded_math<double>,
boost::numeric::interval_lib::checking_strict<double> > >]
typename std::enable_if<std::is_arithmetic<_A1>::value, bool>::type
答案 0 :(得分:2)
貌似Boost.Numeric Interval代码取决于非便携式行为-确切地说,是在非算术类型上调用isnan
的能力。
<cmath>
中的例程仅需要与算术类型一起使用,算术类型定义为(广泛地)定义为“内置积分和浮点类型”。
libstdc ++在此处实现了扩展以支持其他类型,而libc ++则不支持。
内部棒球:标准的相关部分(和其他部分)
[稍后]:一个更基本的问题(导致我在上面说过)是使用std::__1::complex<boost::numeric::interval<double...>
。
这也是不可移植的:[complex.numbers] / 2说:
对于浮点,双精度或长双精度以外的任何类型的模板复合体,实例化的效果均未指定。