【问题标题】:How to convert boost::units::metric::hour_base_unit to boost::units::si::time?如何将 boost::units::metric::hour_base_unit 转换为 boost::units::si::time?
【发布时间】:2014-08-26 18:25:17
【问题描述】:

我想让以下代码正确编译:

#include <boost/units/systems/si.hpp>
#include <boost/units/base_units/metric/hour.hpp>

int main(int argc, char **argv) {
  using namespace boost::units;
  quantity<si::time> t = 2.0 * metric::hour_base_unit::unit_type(); 
}

使用 gcc,我得到以下错误:

error: conversion from ‘boost::units::multiply_typeof_helper<double, boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<1l> >, boost::units::dimensionless_type>, boost::units::heterogeneous_system<boost::units::heterogeneous_system_impl<boost::units::list<boost::units::heterogeneous_system_dim<boost::units::scaled_base_unit<boost::units::si::second_base_unit, boost::units::scale<60l, boost::units::static_rational<2l> > >, boost::units::static_rational<1l> >, boost::units::dimensionless_type>, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<1l> >, boost::units::dimensionless_type>, boost::units::dimensionless_type> >, void> >::type {aka boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<1l> >, boost::units::dimensionless_type>, boost::units::heterogeneous_system<boost::units::heterogeneous_system_impl<boost::units::list<boost::units::heterogeneous_system_dim<boost::units::scaled_base_unit<boost::units::si::second_base_unit, boost::units::scale<60l, boost::units::static_rational<2l> > >, boost::units::static_rational<1l> >, boost::units::dimensionless_type>, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<1l> >, boost::units::dimensionless_type>, boost::units::dimensionless_type> >, void>, double>}’ to non-scalar type ‘boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<1l> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10l, boost::units::static_rational<3l> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > > > >’ requested
   quantity<si::time> t = 2.0 * metric::hour_base_unit::unit_type();
                               ^

我错过了什么?

【问题讨论】:

    标签: c++ boost-units


    【解决方案1】:

    快速浏览文档意味着unit 类之间的大多数(如果不是全部)转换是explicit(它是design decision)。因此,您可以使用直接初始化而不是复制初始化:

    #include <boost/units/systems/si.hpp>
    #include <boost/units/base_units/metric/hour.hpp>
    
    int main(int argc, char **argv) {
      using namespace boost::units;
      quantity<si::time,double> xxxxxx (2.0 * metric::hour_base_unit::unit_type());
    }
    

    而且它有效。

    this answer 中解释了此方法有效而您的尝试无效的原因。

    希望对您有所帮助。

    【讨论】:

    • 感谢您的快速回复 :) 这将解决这个特定 C++ 文件的问题,但我试图解决另一个使用更复杂表达式的问题。我真正想要的是一种无需使用 BOOST_UNITS_DEFINE_CONVERSION_FACTOR 即可打开隐式转换的简单方法(公制小时是 si::seconds 的缩放单位)。
    • 我觉得奇怪的是库中没有定义名为metric::liter 的常量。 namespace boost::units::metric{liter_base_unit::unit_type liter{};}.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多