
Hello, I'm trying to use absolute temperature in some expressions. Unfortunately I'm having some issues with the compilation. For instance, if I divide an absolute temperature by itself I would expect to get 1 dimensionless, however that will cause a compilation error. #include <iostream> #include <boost/units/absolute.hpp> #include <boost/units/io.hpp> #include <boost/units/quantity.hpp> #include <boost/units/systems/si.hpp> #include <boost/units/systems/si/io.hpp> int main(int argc, char** argv) { using namespace boost::units; quantity<si::temperature> rT(273.15 * si::kelvin); // relative temperature quantity<si::dimensionless> v; v = rT / rT; std::cout << v << std::endl; // 1 dimensionless quantity<absolute<si::temperature> > aT(273.15 * absolute<si::temperature>()); // absolute temperature //v = aT / aT; // uncommenting this line will cause compilation errors //std::cout << v << std::endl; // 1 dimensionless return 0; } If I uncomment the line with v = aT / aT, in ubuntu 15.10 with boost 1.58 and gcc 5.2.1, I get the error: (...) /usr/include/boost/units/operators.hpp:81:5: error: no match for ‘operator/’ (operand types are ‘boost::units::absolute<boost::units::unit<boost::units::list<boost::units::dim<boost::units::temperature_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> > > > > > > > > > > >’ and ‘boost::units::absolute<boost::units::unit<boost::units::list<boost::units::dim<boost::units::temperature_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> > > > > > > > > > > >’) BOOST_TYPEOF_NESTED_TYPEDEF_TPL(nested, (typeof_::make<X>()/typeof_::make<Y>())) (...) I could add something like namespace boost { namespace units { template<class Unit, class X, class Y> struct divide_typeof_helper<quantity<absolute<Unit>, X>, quantity<absolute<Unit>, Y> > { typedef typename divide_typeof_helper<X, Y>::type value_type; typedef typename divide_typeof_helper<Unit, Unit>::type unit_type; typedef quantity <unit_type, value_type> type; }; } } but that would not work in more complex examples, e.g.: #include <boost/units/systems/si/codata/physico-chemical_constants.hpp> (...) using namespace boost::units::si::constants::codata; typedef boost::mpl::divides<boost::units::energy_dimension, boost::units::amount_dimension>::type Ea_dimension; typedef boost::units::unit<Ea_dimension, boost::units::si::system> Ea; quantity<Ea> ea(0); auto x = ea / (R * aT); Any help would be most appreciated, João Leal