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