这是一个非常简约的例子。我以下列方式使用Boost.Units :
#define REAL double
...
using namespace boost::units;
quantity<si::velocity, REAL> v;
然后有时我需要有类似的东西
quantity<si::velocity, REAL> v_halved;
v_halved = 0.5 * v;
0.5
这可以正常工作,因为编译器将double
. 但是,当REAL
有什么不同时,我会得到一个编译错误,例如,如果我将定义更改为REAL
编译long double
抱怨:
error: no match for ‘operator*’ in ‘5.0e-1 * v’
/usr/include/boost/units/detail/one.hpp:58: note: candidates are: boost::units::one boost::units::operator*(const boost::units::one&, const boost::units::one&)
查看Boost.Units 文档,我发现它的operator*
重载如下:
// runtime scalar times quantity
template<typename Unit, typename X>
multiply_typeof_helper< X, quantity< Unit, X > >::type
operator*(const X & lhs, const quantity< Unit, X > & rhs);
尽管从定义中可以清楚地看出数量的标量和内部类型必须相同,但我希望编译器在可以隐式进行转换时自动转换类型(例如 from double
to long double
)。但是我认为我可能会遗漏一些东西,因为自动类型转换当然适用于其他简单的函数,比如long double f(long double const & ld)
.
我的问题是我已经使用v_halved = 0.5 * v
了很多类似的表达式,我的项目已经变得相当大,而且直到现在,在必须定义之后REAL
我long double
才意识到这是一个问题。所以,我想知道一个解决方法/解决方案,我知道这static_cast<REAL>(0.5)
将是一个解决方案,但我仍然觉得我错过了一些关于编译器无法自动将标量转换为正确类型的东西。
提前非常感谢!