ブースト ユニットを独学で習得しようとしていますが、フロートの代わりにユニットを使用する場合に問題が発生しています。
計算にカスタムのダルトン/アム単位を使用しています。私の古いコードは次のように動作します
float baseMass = 14.95; float totalMass = baseMass * 12;
ただし、ユニットでも同じことを行います(dalton_tは数量のtypedefです)
dalton_t baseMass = 14.95 * units::dalton_mass; dalton_t totalMass = baseMass * 12;
「バイナリ式のオペランドが無効です」というエラーが表示されます。これは、12 がある種の無次元単位であるべきだということですか?
また、順序付けられていないセットのキーとして質量を使用します。
typedef boost::unordered_set<types::dalton_t> DaltonSet; DaltonSet dSet; dalton_t testMass(13384.384 * phobos::units::dalton_mass); dSet.insert(testMass);
これにより、ユニットのヘッダー ファイルで定義されているにもかかわらず、「hash_value の呼び出しに一致する関数がありません」というエラーが発生します。
これらのいずれかのアイデアはありますか?
単位ヘッダー ファイルは次のとおりです。
#ifndef UNITS_H_
#define UNITS_H_
#include <boost/functional/hash.hpp>
#include <boost/units/conversion.hpp>
#include <boost/units/io.hpp>
#include <boost/units/pow.hpp>
#include <boost/units/systems/si.hpp>
#include <boost/units/systems/si/prefixes.hpp>
namespace phobos {
namespace units {
using boost::units::mass_dimension;
using boost::units::pow;
using boost::units::root;
using boost::units::quantity;
using boost::units::unit;
struct amu_mass_base_unit :
boost::units::base_unit<amu_mass_base_unit, mass_dimension, 1> {
static std::string name() { return "atomic mass unit"; }
static std::string symbol() { return "u"; }
};
typedef boost::units::make_system<amu_mass_base_unit>::type amu_system;
typedef unit<mass_dimension, amu_system> amu_mass;
static const amu_mass dalton_mass;
} /* namespace units */
namespace types {
using boost::units::quantity;
typedef quantity<units::amu_mass, float> amu_t;
typedef amu_t dalton_t;
} /* namespace types */
} /* namespace phobos */
BOOST_UNITS_DEFINE_CONVERSION_FACTOR(phobos::units::amu_mass_base_unit,
boost::units::si::kilogram_base_unit,
float, 1.66053892173e-27);
std::size_t hash_value(const phobos::types::amu_t &amu) {
return boost::hash_value(amu.value());
}
#endif /* UNITS_H_ */
前もって感謝します!
アダム