[Units] Converting from angular_velocity to degrees_per_second

I need to make a conversion from a general angular_velocity to degrees/second. For example: boost::units::quantity< boost::units::si::angular_velocity> m_speed((30.0*boost::units::si::radians_per_second)); uint32_t result = static_cast<uint32_t>(boost::units::quantity<boost::units::si::angular_velocity,uint32_t>(m_speed*boost::units::degree::degrees/boost::units::si::seconds).value()); However it fails to compile in gcc 4.4, reporting: error:incomplete type '[type removed]' used in nested name specifier Could someone explain the proper syntax to achieve the desired type specification and subsequent conversion? Do I need to specify a degrees_per_second unit, and if so, how? Thank you in advance for your help. Cheers! Andrew Hundt

I have made my question more specific so it will be easier to answer. I need to make a conversion from a general angular_velocity to degrees/second. To illustrate this problem the example boostUnits.cpp: #include <boost/units/systems/si.hpp> #include <boost/units/systems/angle/revolutions.hpp> #include <boost/units/systems/angle/degrees.hpp> #include <boost/units/conversion.hpp> #include <boost/units/pow.hpp> #include <iostream> #include <iterator> #include <algorithm> int main() { boost::units::quantity< boost::units::si::angular_velocity> m_speed((30.0*boost::units::si::radians_per_second)); std::cout << "m_speed: " << m_speed << std::endl; uint32_t result = static_cast<uint32_t>(boost::units::quantity<boost::units::si::angular_velocity,uint32_t>(m_speed*boost::units::degree::degrees/boost::units::si::seconds).value()); std::cout << " result: "<< result << std::endl; return(0); } Produces this compiler output: g++ boostUnits.cpp /usr/local/include/boost/units/detail/conversion_impl.hpp: In static member function ‘static boost::units::quantity<Unit2, T2> boost::units::conversion_helper<boost::units::quantity<Unit1, T1>, boost::units::quantity<Unit2, T2> >::convert(const boost::units::quantity<Unit1, T1>&) [with Unit1 = boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::dimensionless_type>
, boost::units::heterogeneous_system<boost::units::heterogeneous_system_impl<boost::units::list<boost::units::heterogeneous_system_dim<boost::units::angle::degree_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::heterogeneous_system_dim<boost::units::si::second_base_unit, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::heterogeneous_system_dim<boost::units::angle::radian_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type> > , boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::dimensionless_type> , boost::units::dimensionless_type> >, void>, T1 = double, Unit2 = boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000001l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<1l, 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, 1l> > >, 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> > > > > > > > > >, void>, T2 = unsigned int]’: /usr/local/include/boost/units/quantity.hpp:193: instantiated from ‘boost::units::quantity<Unit, Y>::quantity(const boost::units::quantity<Unit2, YY>&, typename boost::disable_if<boost::mpl::and_<typename boost::units::is_implicitly_convertible<Unit2, Unit>::type, boost::units::detail::is_non_narrowing_conversion<YY, Y>, mpl_::bool_<true>, mpl_::bool_<true>, mpl_::bool_<true> >, typename boost::units::detail::disable_if_is_same<Unit, Unit2>::type>::type*) [with Unit2 = boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::dimensionless_type> , boost::units::heterogeneous_system<boost::units::heterogeneous_system_impl<boost::units::list<boost::units::heterogeneous_system_dim<boost::units::angle::degree_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::heterogeneous_system_dim<boost::units::si::second_base_unit, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::heterogeneous_system_dim<boost::units::angle::radian_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type> > , boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::dimensionless_type> , boost::units::dimensionless_type> >, void>, YY = double, Unit = boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000001l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<1l, 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, 1l> > >, 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> > > > > > > > > >, void>, Y = unsigned int]’ boostUnits.cpp:16: instantiated from here /usr/local/include/boost/units/detail/conversion_impl.hpp:345: error: no matching function for call to ‘conversion_factor(boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::dimensionless_type> , boost::units::heterogeneous_system<boost::units::heterogeneous_system_impl<boost::units::list<boost::units::heterogeneous_system_dim<boost::units::angle::degree_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::heterogeneous_system_dim<boost::units::si::second_base_unit, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::heterogeneous_system_dim<boost::units::angle::radian_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type> > , boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::dimensionless_type> , boost::units::dimensionless_type> >, void>&, boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000001l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<1l, 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, 1l> > >, 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> > > > > > > > > >, void>&)’
What is the syntax to achieve the desired type specification and subsequent conversion? Do I need to specify a degrees_per_second unit, and if so, how? Thank you in advance for your help. Cheers! Andrew Hundt On Tue, Nov 30, 2010 at 7:29 PM, Andrew Hundt <athundt@gmail.com> wrote:
I need to make a conversion from a general angular_velocity to degrees/second. For example:
boost::units::quantity< boost::units::si::angular_velocity> m_speed((30.0*boost::units::si::radians_per_second)); uint32_t result = static_cast<uint32_t>(boost::units::quantity<boost::units::si::angular_velocity,uint32_t>(m_speed*boost::units::degree::degrees/boost::units::si::seconds).value());
However it fails to compile in gcc 4.4, reporting: error:incomplete type '[type removed]' used in nested name specifier
Could someone explain the proper syntax to achieve the desired type specification and subsequent conversion? Do I need to specify a degrees_per_second unit, and if so, how? Thank you in advance for your help.
Cheers! Andrew Hundt

AMDG On 12/1/2010 11:10 AM, Andrew Hundt wrote:
I have made my question more specific so it will be easier to answer. I need to make a conversion from a general angular_velocity to degrees/second.
There's no such thing as a general angular_velocity. I assume that you mean that you want to convert from radians/second to degrees/second.
To illustrate this problem the example boostUnits.cpp:
#include<boost/units/systems/si.hpp> #include<boost/units/systems/angle/revolutions.hpp> #include<boost/units/systems/angle/degrees.hpp> #include<boost/units/conversion.hpp> #include<boost/units/pow.hpp> #include<iostream> #include<iterator> #include<algorithm>
int main() { boost::units::quantity< boost::units::si::angular_velocity> m_speed((30.0*boost::units::si::radians_per_second)); std::cout<< "m_speed: "<< m_speed<< std::endl;
uint32_t result = static_cast<uint32_t>(boost::units::quantity<boost::units::si::angular_velocity,uint32_t>(m_speed*boost::units::degree::degrees/boost::units::si::seconds).value()); std::cout<< " result:"<< result<< std::endl;
return(0); }
Try typedef boost::units::divide_typeof_helper< boost::units::degree::plane_angle, boost::units::si::time
::type degrees_per_second;
static_cast<boost::units::quantity<degrees_per_second> >(m_speed); In Christ, Steven Watanabe

Steven, Thanks! That worked perfectly. I spent quite a bit of time trying to solve this problem and others similar to it, and could not find anything in the examples. Would it be reasonable if I were to take a bit of time to add this example to conversion.cpp (or whatever example you feel is appropriate) and add it to the documentation? Cheers! Andrew Hundt ------------------------------------------------------------------------- For those who search for boost.units conversion examples, here is a working solution boostUnits.cpp: #include <boost/units/systems/si.hpp> #include <boost/units/systems/angle/revolutions.hpp> #include <boost/units/systems/angle/degrees.hpp> #include <boost/units/conversion.hpp> #include <boost/units/pow.hpp> #include <iostream> #include <iterator> #include <algorithm> typedef boost::units::divide_typeof_helper< boost::units::degree::plane_angle, boost::units::si::time >::type degrees_per_second; int main() { boost::units::quantity< boost::units::si::angular_velocity> m_speed((30.0*boost::units::si::radians_per_second)); std::cout << "m_speed rad/sec: " << m_speed << std::endl; std::cout << " m_speed deg/sec: "<< static_cast<boost::units::quantity<degrees_per_second> >(m_speed) << std::endl; uint32_t result = static_cast<uint32_t>(static_cast<boost::units::quantity<degrees_per_second>
(m_speed).value()); std::cout << " int result: "<< result << std::endl;
return(0); } ------------------------------------------------------------------------- Output: g++ boostUnits.cpp ./a.out m_speed rad/sec: 30 s^-1 rad m_speed deg/sec: 1718.87 deg s^-1 int result: 1718 ------------------------------------------------------------------------- Steven Watanabe <watanabesj <at> gmail.com> writes:
AMDG
On 12/1/2010 11:10 AM, Andrew Hundt wrote:
I have made my question more specific so it will be easier to answer. I need to make a conversion from a general angular_velocity to degrees/second.
There's no such thing as a general angular_velocity. I assume that you mean that you want to convert from radians/second to degrees/second.
To illustrate this problem the example boostUnits.cpp:
#include<boost/units/systems/si.hpp> #include<boost/units/systems/angle/revolutions.hpp> #include<boost/units/systems/angle/degrees.hpp> #include<boost/units/conversion.hpp> #include<boost/units/pow.hpp> #include<iostream> #include<iterator> #include<algorithm>
int main() { boost::units::quantity< boost::units::si::angular_velocity> m_speed((30.0*boost::units::si::radians_per_second)); std::cout<< "m_speed: "<< m_speed<< std::endl;
uint32_t result =
static_cast<uint32_t>(boost::units::quantity<boost::units::si::angular_velocity,uint32_t>(m_speed*boost::units::degree::degrees/boost::units::si::seconds).value());
std::cout<< " result:"<< result<< std::endl;
return(0); }
Try
typedef boost::units::divide_typeof_helper< boost::units::degree::plane_angle, boost::units::si::time
::type degrees_per_second;
static_cast<boost::units::quantity<degrees_per_second> >(m_speed);
In Christ, Steven Watanabe
Cheers! Andrew Hundt On Wed, Dec 1, 2010 at 2:10 PM, Andrew Hundt <athundt@gmail.com> wrote:
I have made my question more specific so it will be easier to answer. I need to make a conversion from a general angular_velocity to degrees/second.
To illustrate this problem the example boostUnits.cpp:
#include <boost/units/systems/si.hpp> #include <boost/units/systems/angle/revolutions.hpp> #include <boost/units/systems/angle/degrees.hpp> #include <boost/units/conversion.hpp> #include <boost/units/pow.hpp> #include <iostream> #include <iterator> #include <algorithm>
int main() { boost::units::quantity< boost::units::si::angular_velocity> m_speed((30.0*boost::units::si::radians_per_second)); std::cout << "m_speed: " << m_speed << std::endl;
uint32_t result = static_cast<uint32_t>(boost::units::quantity<boost::units::si::angular_velocity,uint32_t>(m_speed*boost::units::degree::degrees/boost::units::si::seconds).value()); std::cout << " result: "<< result << std::endl;
return(0); }
Produces this compiler output:
g++ boostUnits.cpp /usr/local/include/boost/units/detail/conversion_impl.hpp: In static member function ‘static boost::units::quantity<Unit2, T2> boost::units::conversion_helper<boost::units::quantity<Unit1, T1>, boost::units::quantity<Unit2, T2> >::convert(const boost::units::quantity<Unit1, T1>&) [with Unit1 = boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::dimensionless_type>
, boost::units::heterogeneous_system<boost::units::heterogeneous_system_impl<boost::units::list<boost::units::heterogeneous_system_dim<boost::units::angle::degree_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::heterogeneous_system_dim<boost::units::si::second_base_unit, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::heterogeneous_system_dim<boost::units::angle::radian_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type> > , boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::dimensionless_type> , boost::units::dimensionless_type> >, void>, T1 = double, Unit2 = boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000001l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<1l, 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, 1l> > >, 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> > > > > > > > > >, void>, T2 = unsigned int]’: /usr/local/include/boost/units/quantity.hpp:193: instantiated from ‘boost::units::quantity<Unit, Y>::quantity(const boost::units::quantity<Unit2, YY>&, typename boost::disable_if<boost::mpl::and_<typename boost::units::is_implicitly_convertible<Unit2, Unit>::type, boost::units::detail::is_non_narrowing_conversion<YY, Y>, mpl_::bool_<true>, mpl_::bool_<true>, mpl_::bool_<true> >, typename boost::units::detail::disable_if_is_same<Unit, Unit2>::type>::type*) [with Unit2 = boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::dimensionless_type> , boost::units::heterogeneous_system<boost::units::heterogeneous_system_impl<boost::units::list<boost::units::heterogeneous_system_dim<boost::units::angle::degree_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::heterogeneous_system_dim<boost::units::si::second_base_unit, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::heterogeneous_system_dim<boost::units::angle::radian_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type> > , boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::dimensionless_type> , boost::units::dimensionless_type> >, void>, YY = double, Unit = boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000001l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<1l, 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, 1l> > >, 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> > > > > > > > > >, void>, Y = unsigned int]’ boostUnits.cpp:16: instantiated from here /usr/local/include/boost/units/detail/conversion_impl.hpp:345: error: no matching function for call to ‘conversion_factor(boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::dimensionless_type> , boost::units::heterogeneous_system<boost::units::heterogeneous_system_impl<boost::units::list<boost::units::heterogeneous_system_dim<boost::units::angle::degree_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::heterogeneous_system_dim<boost::units::si::second_base_unit, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::heterogeneous_system_dim<boost::units::angle::radian_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type> > , boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::dimensionless_type> , boost::units::dimensionless_type> >, void>&, boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000001l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<1l, 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, 1l> > >, 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> > > > > > > > > >, void>&)’
What is the syntax to achieve the desired type specification and subsequent conversion? Do I need to specify a degrees_per_second unit, and if so, how?
Thank you in advance for your help.
Cheers! Andrew Hundt
On Tue, Nov 30, 2010 at 7:29 PM, Andrew Hundt <athundt@gmail.com> wrote:
I need to make a conversion from a general angular_velocity to degrees/second. For example:
boost::units::quantity< boost::units::si::angular_velocity> m_speed((30.0*boost::units::si::radians_per_second)); uint32_t result = static_cast<uint32_t>(boost::units::quantity<boost::units::si::angular_velocity,uint32_t>(m_speed*boost::units::degree::degrees/boost::units::si::seconds).value());
However it fails to compile in gcc 4.4, reporting: error:incomplete type '[type removed]' used in nested name specifier
Could someone explain the proper syntax to achieve the desired type specification and subsequent conversion? Do I need to specify a degrees_per_second unit, and if so, how? Thank you in advance for your help.
Cheers! Andrew Hundt
participants (2)
-
Andrew Hundt
-
Steven Watanabe