How to convert boost::units::metric::hour_base_unit to boost::units::si::time?

1k Views Asked by At

I would like to make the following code compile properly:

#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(); 
}

Using gcc, I get the following error:

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();
                               ^

What am I missing?

1

There are 1 best solutions below

2
On

A quick look through the documentation implies that most (if not all) conversions between unit classes are explicit (it's a design decision). Therefore, you can use direct-initiliazation instead of copy-initialization:

#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());
}

And it works.

The reason why this works while your attempt doesn't is explained in this answer.

Hope that helps.