Why don't you give a code snippet that does what you want to do?
using namespace boost::units;
class Test {
public:
void setX(quantity<si::length> const& x) {
m_X = x;
}
private:
quantity<si::length> m_X;
};
int main(int, char const *[]) {
typedef boost::units::us::foot_base::unit_type foot_unit;
static const foot_unit foot;
Test a;
quantity<si::length> first (1.0 * si::meter);
quantity<foot_unit> second(1.0 * foot);
quantity<boost::units::si::meter_base_unit::unit_type> third (1.0 * si::meter);
a.setX(first);
a.setX(second);
a.setX(third);
return 0;
}
#include <boost/units/quantity.hpp>
#include <boost/units/systems/si.hpp>
#include <boost/units/base_units/us/foot.hpp>
using namespace boost::units;
class Test {
public:
// takes any unit of length
template<class System>
void setX(quantity<unit<length_dimension,System> > const& x) {
// explicit conversion to si::length = meters
m_X = quantity<si::length>(x);
}
private:
quantity<si::length> m_X;
};
int main(int, char const *[]) {
typedef boost::units::us::foot_base_unit::unit_type foot_unit;
static const foot_unit foot;
Test a;
quantity<si::length> first (1.0 * si::meter);
quantity<foot_unit> second(1.0 * foot);
quantity<boost::units::si::meter_base_unit::unit_type> third (1.0 * si::meter);
a.setX(first);
a.setX(second);
a.setX(third);
return 0;
}