yes I was thinking something like that, like creating an
si::energy_base_unit but then it will be full of base units if I do it
this for every dimension. Besides it worked in one direction.
If you could provide either
the error message, or even better, the definition of the atomic
system, I could help more.
this is gcc 4.4.1, boost-1.40
error messages, atomic.hpp and main.cpp are attached below.
Thank you,
Alfredo
---begin error message -----------------------------------
In file included from /usr/include/boost/units/conversion.hpp:14,
from /usr/include/boost/units/quantity.hpp:29,
from eos.cpp:7:
/usr/include/boost/units/detail/conversion_impl.hpp: In instantiation
of
‘boost::units::detail::conversion_impl<1>::apply >,
boost::units::dimensionless_type>,
boost::units::homogeneous_system > >,
boost::units::list > > > >’:
/usr/include/boost/units/detail/conversion_impl.hpp:445:
instantiated from
‘boost::units::detail::conversion_factor_helper >,
boost::units::dimensionless_type>,
boost::units::heterogeneous_system >,
boost::units::dimensionless_type>,
boost::units::list >,
boost::units::dimensionless_type>, boost::units::dimensionless_type>
, void>,
boost::units::unit >,
boost::units::dimensionless_type>,
boost::units::heterogeneous_system >,
boost::units::list > >,
boost::units::static_rational<1l, 2l> >,
boost::units::list >,
boost::units::dimensionless_type> > >,
boost::units::list >,
boost::units::dimensionless_type>, boost::units::dimensionless_type>
, void> >’
/usr/include/boost/units/detail/conversion_impl.hpp:274:
instantiated from
‘boost::units::detail::call_base_unit_converter_impl<false>::apply >,
boost::units::dimensionless_type>,
boost::units::heterogeneous_system >,
boost::units::list > >,
boost::units::static_rational<1l, 2l> >,
boost::units::list >,
boost::units::dimensionless_type> > >,
boost::units::list >,
boost::units::dimensionless_type>, boost::units::dimensionless_type>
, void> >’
/usr/include/boost/units/detail/conversion_impl.hpp:289:
instantiated from
‘boost::units::detail::call_base_unit_converter >,
boost::units::dimensionless_type>,
boost::units::heterogeneous_system >,
boost::units::list > >,
boost::units::static_rational<1l, 2l> >,
boost::units::list >,
boost::units::dimensionless_type> > >,
boost::units::list >,
boost::units::dimensionless_type>, boost::units::dimensionless_type>
, void> >’
/usr/include/boost/units/detail/conversion_impl.hpp:316:
instantiated from
‘boost::units::detail::conversion_impl<1>::apply >,
boost::units::dimensionless_type>,
boost::units::homogeneous_system > >,
boost::units::list > > > >’
/usr/include/boost/units/detail/conversion_impl.hpp:316:
instantiated from
‘boost::units::detail::conversion_impl<2>::apply > >,
boost::units::static_rational<1l, 1l> >,
boost::units::list >,
boost::units::dimensionless_type> >,
boost::units::homogeneous_system > >,
boost::units::list > > > >’
/usr/include/boost/units/detail/conversion_impl.hpp:316:
instantiated from
‘boost::units::detail::conversion_impl<3>::apply >,
boost::units::list > >,
boost::units::static_rational<1l, 1l> >,
boost::units::list >,
boost::units::dimensionless_type> > >,
boost::units::homogeneous_system > >,
boost::units::list > > > >’
/usr/include/boost/units/detail/conversion_impl.hpp:445:
instantiated from
‘boost::units::detail::conversion_factor_helper >,
boost::units::list >,
boost::units::list >,
boost::units::dimensionless_type> > >,
boost::units::heterogeneous_system >,
boost::units::list > >,
boost::units::static_rational<1l, 1l> >,
boost::units::list >,
boost::units::dimensionless_type> > >,
boost::units::list >,
boost::units::list >,
boost::units::list >,
boost::units::dimensionless_type> > >,
boost::units::dimensionless_type> >, void>,
boost::units::unit >,
boost::units::list >,
boost::units::list >,
boost::units::dimensionless_type> > >,
boost::units::heterogeneous_system >,
boost::units::dimensionless_type>,
boost::units::list >,
boost::units::list >,
boost::units::list >,
boost::units::dimensionless_type> > >,
boost::units::dimensionless_type> >, void> >’
/usr/include/boost/units/detail/conversion_impl.hpp:40: instantiated
from
‘boost::units::detail::conversion_factor_helper >,
boost::units::list >,
boost::units::list >,
boost::units::dimensionless_type> > >,
boost::units::homogeneous_system > >,
boost::units::list > > > > > > > > >, void>,
boost::units::unit >,
boost::units::list >,
boost::units::list >,
boost::units::dimensionless_type> > >,
boost::units::homogeneous_system > > > > >, void> >’
/usr/include/boost/units/detail/conversion_impl.hpp:345:
instantiated from ‘static boost::units::quantity
boost::units::conversion_helper,
boost::units::quantity >::convert(const
boost::units::quantity&) [with Unit1 =
boost::units::unit >,
boost::units::list >,
boost::units::list >,
boost::units::dimensionless_type> > >,
boost::units::homogeneous_system > >,
boost::units::list > > > > > > > > >, void>, T1 =
double, Unit2 =
boost::units::unit >,
boost::units::list >,
boost::units::list >,
boost::units::dimensionless_type> > >,
boost::units::homogeneous_system > > > > >, void>, T2 = double]’
/usr/include/boost/units/quantity.hpp:193: instantiated from
‘boost::units::quantity::quantity(const
boost::units::quantity&, typename
boost::disable_if::type,
boost::units::detail::is_non_narrowing_conversion,
mpl_::bool_<true>, mpl_::bool_<true>, mpl_::bool_<true> >, typename
boost::units::detail::disable_if_is_same::type>::type*)
[with Unit2 =
boost::units::unit >,
boost::units::list >,
boost::units::list >,
boost::units::dimensionless_type> > >,
boost::units::homogeneous_system > >,
boost::units::list > > > > > > > > >, void>, YY =
double, Unit =
boost::units::unit >,
boost::units::list >,
boost::units::list >,
boost::units::dimensionless_type> > >,
boost::units::homogeneous_system > > > > >, void>, Y = double]’
eos.cpp:89: instantiated from here
/usr/include/boost/units/detail/conversion_impl.hpp:316: error: no
type named ‘type’ in ‘struct
boost::units::detail::call_base_unit_converter >,
boost::units::dimensionless_type>,
boost::units::heterogeneous_system >,
boost::units::list > >,
boost::units::static_rational<1l, 2l> >,
boost::units::list >,
boost::units::dimensionless_type> > >,
boost::units::list >,
boost::units::dimensionless_type>, boost::units::dimensionless_type>
, void> >’
compilation terminated due to -Wfatal-errors.
---end error message --------------------------------
---begin
atomic.hpp---------------------------------------------------------------------------------------------------------------------------------
#include
//equivalent to includes in units/systems/si/base.hpp
#include
#include
#include
//#include //do not remove: '...has initializer
but incomplete type...' error
//equivalent to includes in //equivalent to ./base_units/si/*.hpp
#include
#include
#include
#include
#include
#include
#include
#include
#include
//equivalent to ./base_units/si/*.hpp
namespace boost{
namespace units{
namespace atomic{ //define namespace au=boost::units::atomic if
necessary
using std::string;
// taken from http://en.wikipedia.org/wiki/Atomic_units#Fundamental_units
struct electron_mass_base_unit : base_unit{
static string name() {return ("electron_mass");}
static string symbol() {return ("me");}
};
//equivalent to ./base_units/si/meter.hpp>
struct bohr_radius_base_unit : base_unit{
static string name() {return ("bohr_radius");}
static string symbol() {return ("a0");}
};
struct elementary_charge_base_unit :
base_unit{
static string name() {return ("elementary_charge");}
static string symbol() {return ("e");}
};
struct reduced_planck_constant_base_unit :
base_unit{
static string name() {return ("reduced_planck_constant");}
static string symbol() {return ("hbar");}
};
struct hartree_energy_base_unit :
base_unit{
static string name() {return ("hartree_energy");}
static string symbol() {return ("Eh");}
};
}}}//nss
//similar to ./systems/si/base.hpp
namespace boost{
namespace units{
namespace atomic{
typedef make_system<
electron_mass_base_unit,
bohr_radius_base_unit,
elementary_charge_base_unit,
reduced_planck_constant_base_unit,
hartree_energy_base_unit
>::type system;
}}}
//equivalent to units/systems/si/.*.hpp
namespace boost{
namespace units{
namespace atomic{
typedef unit dimensionless;
typedef unit mass;
typedef unit length;
typedef unit electric_charge;
typedef unit angular_momentum;
typedef unit energy;
static const mass electron_mass;
static const length bohr_radius, bohr;
static const electric_charge elementary_charge;
static const angular_momentum reduced_planck_constant;
static const energy hartree_energy, hartree;
}}}
#include
//derived, equiv for example to units/systems/si/area.hpp
namespace boost{
namespace units{
namespace atomic{
typedef unit area;
typedef unit volume;
typedef unit pressure;
}}}
---end atomic.hpp
---begin
main.cpp-------------------------------------------------------------------------------------------------------------------------------------
#include
#include
#include
#include //helps transforms the output
from kg/m/s^2 to J
#include
#include
#include
#include
#include"boost/units/atomic.hpp"
//#include
#include<iostream>
#include"boost/units/base_units/metric/angstrom.hpp"
namespace boost{
namespace units{
namespace metric{
typedef metric::angstrom_base_unit::unit_type angstrom_unit;
BOOST_UNITS_STATIC_CONSTANT(angstrom, angstrom_unit);
}}}
/*
namespace boost { namespace units
{
typedef metric::angstrom_base_unit::unit_type angstrom_unit;
BOOST_UNITS_STATIC_CONSTANT(angstrom, angstrom_unit);
typedef scaled_base_unit<
si::meter_base_unit,
scale<10, static_rational<-9> >
> nanometer_base_unit;
typedef nanometer_base_unit::unit_type nanometer_unit;
BOOST_UNITS_STATIC_CONSTANT(nanometer, nanometer_unit);
// typedef make_scaled_unit > >::type nanometer;
} } // namespace boost::units
*/
using std::clog;
using std::endl;
using namespace boost::units;
class vinet{
public:
class parameters{
public:
quantityatomic::volume v0; //volume
quantityatomic::energy phi0;
};
};
BOOST_UNITS_DEFINE_CONVERSION_FACTOR(
atomic::bohr_radius_base_unit,
metric::angstrom_base_unit,
double, 0.529177209
);
#include
BOOST_UNITS_DEFINE_CONVERSION_FACTOR(
atomic::hartree_energy_base_unit,
si::energy,
double, 4.359744e-18
);
//compiles but doesn't help for en3
BOOST_UNITS_DEFINE_CONVERSION_FACTOR(
si::energy,
atomic::hartree_energy_base_unit,
double, 1./4.359744e-18
);
int main(){
quantitysi::length l1(1.*si::meter); //works
quantitysi::length l2(1.*atomic::bohr); //works
quantityatomic::length l3(1.*atomic::bohr); //works
quantityatomic::length l4(1.*si::meter); //works
quantitysi::energy en1(1.*si::joules); //works
quantitysi::energy en2(1.*atomic::hartree); //works
quantityatomic::energy en3(1.*atomic::hartree); //work
quantityatomic::energy en4(1.*si::joules); //does not work,
compilation error
return 0;
}
---end main.cpp