1

ブースト ユニットのバージョン: 1.45

コンパイラ: Visual Studio 2008

プラットフォーム: Windows 7

エラー: 次のコードをコンパイルすると、エラー C2440 "initializing" : cannot convert from 'boost::units::quantity' to 'boost::units::quantity' が発生します

[ Unit=boost::units::unit>,boost::units::detail::static_power_impl<0>::apply>::type,boost::units::hogogeneous_system>>>>, Y = double ]

[ Unit=myproject::types::myproject_length ]

クラス 'boost::units::quantity' のコンストラクターは 'explicit' で宣言されています

[ Unit=myproject::types::myproject_length ]

ここで何が問題なのかわかりません。次のコードから "radii_t result =" を削除し、IO ステートメントをコメント アウトすると、上記で引用したのと同じエラーが発生します。以下は私が使用したコードです。ブースト ユニットを習得するまで、しばらくお待ちください。

Q1: このエラーの理由は何ですか? エラー出力の内容は、それを理解するのに役立ちました。

Q2: 上記のエラーが発生しなくても、寸法解析に失敗するとおっしゃいました。タイプがradii^-1になることに私たちは同意していると思います。型を正しい累乗で宣言するにはどうすればよいですか?

スティーブン

#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 {

   //-------------------------------------
   //          Base dimensions
   //-------------------------------------
   struct length_base_dimension : public boost::units::base_dimension<length_base_dimension,1> {};

   //-------------------------------------
   //          Dimensions
   //-------------------------------------

   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;
}
4

1 に答える 1

0
  1. 中心的な問題は、コンパイラ メッセージが切り捨てられることです。gcc では、次のように表示されます。

54:40: error: conversion from ‘boost::units::divide_typeof_helper<double, 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> >::type {aka boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<-0x00000000000000001l> >, 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> > > >, void>, double>}’ to non-scalar type ‘myproject::types::radii_t {aka 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>}’ requested

ただし、一般に、ブーストユニットのコンパイラエラーは少し... 冗長です。通常、私はそれらを理解しようとはしませんが、boost.units を使用して単位が正しいことを確認し、そうでない場合はコードをよく見て何が問題なのかを判断します。あなたの場合、akaタイプを比較して、長さの基本寸法の符号が異なることを確認できます。

Q2 ではboost::units::power_typeof_helper、他のタイプのヘルパーと同様に、あなたの友人です。

于 2011-12-02T21:53:21.983 に答える