我正在尝试在我的项目中使用Boost.Units。我主要使用它,但我希望有一个访问器方法,允许我使用不同的缩放值获取原始值。例如,我想获得一次伏特值,但在另一点我需要以毫伏为单位的值。我可以使用conversion_factor方法转换数字。但是,我想使用传入默认比例的访问器更方便。这是我尝试使用的类的访问器方法:
virtual double get_vm(electric_potential scale = volts) { return (quantity_cast<double>(m_vm)* conversion_factor(volts, scale)); };
我试图像这样使用它:
static const auto millivolts = milli * volts;
double dblVal = get_vm(millivolts);
但是,这不会编译。我收到以下错误:
1>IF_base_cell_type.cpp(31): error C2664: 'double IF_base_cell_type::get_v_rest(boost::units::si::electric_potential)' : cannot convert argument 1 from 'const boost::units::unit<boost::units::list<boost::units::dim<DT1,boost::units::static_rational<2,1>>,boost::units::list<boost::units::dim<Derived,boost::units::static_rational<1,1>>,boost::units::list<boost::units::dim<DT3,boost::units::static_rational<-3,1>>,boost::units::list<boost::units::dim<DT4,boost::units::static_rational<-1,1>>,boost::units::dimensionless_type>>>>,boost::units::heterogeneous_system<boost::units::heterogeneous_system_impl<boost::units::list<T,L>,boost::units::list<boost::units::dim<DT1,boost::units::static_rational<2,1>>,boost::units::list<boost::units::dim<Derived,boost::units::static_rational<1,1>>,boost::units::list<boost::units::dim<DT3,boost::units::static_rational<-3,1>>,boost::units::list<boost::units::dim<DT4,boost::units::static_rational<-1,1>>,boost::units::dimensionless_type>>>>,boost::units::list<boost::units::scale_list_dim<Scale>,boost::units::dimensionless_type>>>,void>' to 'boost::units::si::electric_potential'
1> with
1> [
1> DT1=boost::units::length_base_dimension
1> , Derived=boost::units::mass_base_dimension
1> , DT3=boost::units::time_base_dimension
1> , DT4=boost::units::current_base_dimension
1> , T=boost::units::heterogeneous_system_dim<boost::units::si::meter_base_unit,boost::units::static_rational<2,1>>
1> , L=boost::units::list<boost::units::heterogeneous_system_dim<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit,boost::units::scale<10,boost::units::static_rational<3,1>>>,boost::units::static_rational<1,1>>,boost::units::list<boost::units::heterogeneous_system_dim<boost::units::si::second_base_unit,boost::units::static_rational<-3,1>>,boost::units::list<boost::units::heterogeneous_system_dim<boost::units::si::ampere_base_unit,boost::units::static_rational<-1,1>>,boost::units::dimensionless_type>>>
1> , Scale=boost::units::scale<10,boost::units::static_rational<-3,1>>
1> ]
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
我显然做错了什么,但报告的错误很难解析其中的所有模板代码,我不确定我做错了什么。我希望有人可能做了类似的事情,并能告诉我在哪里误入歧途?
答案 0 :(得分:0)
有点晚了,但也许它可以帮助某人寻找相同的答案......
在Boost.Units中,单位是作为类型实现的。值得注意的是,以下两个表达式的类型不同:
auto centiimeters = centi * meter;
auto millimeters = milli * meter;
因此,使用上述作为函数参数的唯一方法是使其成为模板:
template <typename T>
double get_vm (T unit) {
return (quantity_cast<double>(m_vm)* conversion_factor(volts, unit));
}
用作:
double my_vm = get_vm(milli * meter);