
Matthias, I appreciate your response. Yes I did not compile my example. I should have done that. I took your example and then trimmed down the header file so I can reproduce the error. I am not sure what is wrong here. I get an error not because the destination type is incorrect. It does not even reach that point. I get an error that there is no division operator: [storri@fedora Source]$ g++ -o boost_units boost_units.cpp boost_units.cpp: In function int main(int, char**): boost_units.cpp:44:39: error: no match for operator/ in 1 / boost::units::operator-(const boost::units::quantity<Unit1, X>&, const boost::units::quantity<Unit2, Y>&) [with Unit1 = boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1l> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<myproject::types::radii_base_unit, boost::units::list<myproject::types::minute_base_unit, boost::units::dimensionless_type> > > > >, Unit2 = boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1l> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<myproject::types::radii_base_unit, boost::units::list<myproject::types::minute_base_unit, boost::units::dimensionless_type> > > > >, X = double, Y = double, typename boost::units::subtract_typeof_helper<boost::units::quantity<Unit1, X>, boost::units::quantity<Unit2, Y> >::type = boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1l> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<myproject::types::radii_base_unit, boost::units::list<myproject::types::minute_base_unit, boost::units::dimensionless_type> > > > >, double>]((*(const boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1l> >, boost::units::dimensionless_type>, boost::units::homogeneous_system<boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<myproject::types::radii_base_unit, boost::units::list<myproject::types::minute_base_unit, boost::units::dimensionless_type> > > > >, double>*)(& val2))) If I remove the "radii_t result =" from the following code and comment out the IO statement I get the same error as previously quoted above. Below is the code I used. I appreciate your patience as I learn Boost Units. Q1: What is the reason for this error? What in the error output helped you to figure that out. Q2: Even if the above error did not exist you mentioned that it would fail the dimensional analysis. I think we both agree the type would be radii^-1. How do you declare a type to be raised to the correct power? Stephen ------------------------- #include <boost/units/base_unit.hpp> #include <boost/units/base_units/angle/radian.hpp> #include <boost/units/io.hpp> #include <boost/units/make_system.hpp> #include <boost/units/physical_dimensions/length.hpp> #include <boost/units/physical_dimensions/time.hpp> #include <boost/units/static_constant.hpp> #include <iostream> namespace myproject { namespace types { struct radii_base_unit : public boost::units::base_unit<radii_base_unit, boost::units::length_dimension, 1> { static std::string name() { return("radii"); } static std::string symbol() { return("r"); } }; struct minute_base_unit : public boost::units::base_unit<minute_base_unit, boost::units::time_dimension,3> { static std::string name() { return ("minute"); } static std::string symbol() { return ("min"); } }; typedef boost::units::make_system<radii_base_unit, minute_base_unit, boost::units::angle::radian_base_unit >::type myproject_system_t; typedef boost::units::unit<boost::units::length_dimension,myproject_system_t> myproject_length; typedef boost::units::quantity<myproject_length, double> radii_t; BOOST_UNITS_STATIC_CONSTANT(radii,myproject_length); } } int main ( int, char** ) { using namespace myproject::types; radii_t val1 ( 5 * radii ); radii_t val2 ( 3 * radii ); radii_t result = 1.0 / ( val1 - val2 ); std::cout << result << std::endl; return 0; } On 12/1/11, Matthias Schabel <boost@schabel-family.org> wrote:
I am trying to understand the dimensionality of the following two equations.
--- first equation --- example::types::radii_t val1 = 5 * example::types::radii; example::types::radii_t val2 = 4 * example::types::radii;
example::types::radii_t L1 = 1 / ( val1 - va2 );
va2->val2
This should give you a compile error anyway, since you are trying to assign a length to an inverse length...
If I was doing the dimensional analysis by hand I would see
1 / ( radii - radii )
Such that the end type would be
radii^-1
Given that end type here is the second equation:
example::types::radii_t val3 = 5 * example::types::radii; example::types::dimensionless_t val4 = 10; example::types::dimensionless_t L2 = L1 * val4 * val3;
Doing the dimensional analysis by hand I think I should see:
L2 = radii * (nothing) * radii^-1 = (nothing) or dimensionless
What Boost Units is reporting is that L2 is actually units in radii_t.
I'm not sure I believe you; the code you pasted is not compilable...did you actually compile anything?
--------- QUESTIONS --------------
Q1: How do you print out the types at compile time?
Q2: How can you confirm you have the correc power for a type? For example radii is indeed raised to the -1 power.
Using your earlier header :
#include "types.hpp"
#include <iostream> #include <boost/units/io.hpp>
using namespace myproject::types;
int main() { radii_t val1(5*radii), val2(4*radii);
//auto L1 = 1/(val1-val2); // compile time error due to failed dimensional consistency
radii_t val3(5*radii);
dimensionless_t val4 = 10; dimensionless_t L2(val3*val4/(val1-val2));
std::cout << val1 << std::endl << val2 << std::endl << val3 << std::endl << val4 << std::endl << L2 << std::endl;
return 0; }
gives
5 r 4 r 5 r 10 dimensionless 50 dimensionless