c++ - boost odeint 包示例代码中出现错误 C2309

标签 c++ boost odeint

我一直在使用 VC++ 2010 Express,以及 Windows SDK 7.1 附带的 64 位编译器。我的boost包版本是boost_1_55_0。

boost包odeint的示例代码位于here如下:

#include <iostream>
#include <boost/numeric/odeint.hpp>


using namespace std;
using namespace boost::numeric::odeint;


/* we solve the simple ODE x' = 3/(2t^2) + x/(2t)
 * with initial condition x(1) = 0.
 * Analytic solution is x(t) = sqrt(t) - 1/t
 */

void rhs( const double x , double &dxdt , const double t )
{
    dxdt = 3.0/(2.0*t*t) + x/(2.0*t);
}

void write_cout( const double &x , const double t )
{
    cout << t << '\t' << x << endl;
}

// state_type = double
typedef runge_kutta_dopri5< double > stepper_type;

int main()
{
    double x = 0.0;    
    integrate_adaptive( make_controlled( 1E-12 , 1E-12 , stepper_type() ) ,
                        rhs , x , 1.0 , 10.0 , 0.1 , write_cout );
}

但是,这无法编译。错误信息如下:

1>------ Build started: Project: LearnBoost, Configuration: Debug x64 ------
1>  test_odeint.cpp
1>C:\boost_1_55_0\boost/format/alt_sstream_impl.hpp : warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss
1>C:\boost_1_55_0\boost/range/iterator.hpp(63): error C2039: 'type' : is not a member of 'boost::mpl::eval_if_c<C,F1,F2>'
1>          with
1>          [
1>              C=true,
1>              F1=boost::range_const_iterator<double>,
1>              F2=boost::range_mutable_iterator<const double>
1>          ]
1>          C:\boost_1_55_0\boost/numeric/odeint/algebra/range_algebra.hpp(52) : see reference to class template instantiation 'boost::range_iterator<C>' being compiled
1>          with
1>          [
1>              C=const double
1>          ]
1>          C:\boost_1_55_0\boost/numeric/odeint/stepper/controlled_runge_kutta.hpp(81) : see reference to function template instantiation 'void boost::numeric::odeint::range_algebra::for_each3<Err,const State,const Deriv,boost::numeric::odeint::default_operations::rel_error<Fac1>>(S1 &,S2 &,S3 &,Op)' being compiled
1>          with
1>          [
1>              Err=double,
1>              State=double,
1>              Deriv=double,
1>              Fac1=double,
1>              S1=double,
1>              S2=double,
1>              S3=double,
1>              Op=boost::numeric::odeint::default_operations::rel_error<double>
1>          ]
1>          C:\boost_1_55_0\boost/numeric/odeint/stepper/controlled_runge_kutta.hpp(710) : see reference to function template instantiation 'double boost::numeric::odeint::default_error_checker<Value,Algebra,Operations>::error<StateIn,DerivIn,V,double>(boost::numeric::odeint::range_algebra &,const State &,const Deriv &,Err &,Time) const' being compiled
1>          with
1>          [
1>              Value=double,
1>              Algebra=boost::numeric::odeint::range_algebra,
1>              Operations=boost::numeric::odeint::default_operations,
1>              StateIn=double,
1>              DerivIn=double,
1>              V=double,
1>              State=double,
1>              Deriv=double,
1>              Err=double,
1>              Time=double
1>          ]
1>          C:\boost_1_55_0\boost/numeric/odeint/stepper/controlled_runge_kutta.hpp(660) : see reference to function template instantiation 'boost::numeric::odeint::controlled_step_result boost::numeric::odeint::controlled_runge_kutta<ErrorStepper>::try_step<void(__cdecl *)(double,double &,double),StateInOut,DerivInOut,V,V>(System,const StateIn &,const DerivIn &,double &,StateOut &,DerivOut &,double &)' being compiled
1>          with
1>          [
1>              ErrorStepper=boost::numeric::odeint::runge_kutta_dopri5<double>,
1>              StateInOut=double,
1>              DerivInOut=double,
1>              V=double,
1>              System=void (__cdecl *)(double,double &,double),
1>              StateIn=double,
1>              DerivIn=double,
1>              StateOut=double,
1>              DerivOut=double
1>          ]
1>          C:\boost_1_55_0\boost/numeric/odeint/stepper/controlled_runge_kutta.hpp(853) : see reference to function template instantiation 'boost::numeric::odeint::controlled_step_result boost::numeric::odeint::controlled_runge_kutta<ErrorStepper>::try_step<void(__cdecl *)(double,double &,double),StateInOut,V>(System,StateInOut &,DerivInOut &,double &,double &)' being compiled
1>          with
1>          [
1>              ErrorStepper=boost::numeric::odeint::runge_kutta_dopri5<double>,
1>              StateInOut=double,
1>              V=double,
1>              System=void (__cdecl *)(double,double &,double),
1>              DerivInOut=double
1>          ]
1>          C:\boost_1_55_0\boost/numeric/odeint/stepper/controlled_runge_kutta.hpp(561) : see reference to function template instantiation 'boost::numeric::odeint::controlled_step_result boost::numeric::odeint::controlled_runge_kutta<ErrorStepper>::try_step_v1<void(__cdecl *)(double,double &,double),StateInOut>(System,StateInOut &,double &,double &)' being compiled
1>          with
1>          [
1>              ErrorStepper=boost::numeric::odeint::runge_kutta_dopri5<double>,
1>              StateInOut=double,
1>              System=void (__cdecl *)(double,double &,double)
1>          ]
1>          C:\boost_1_55_0\boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp(98) : see reference to function template instantiation 'boost::numeric::odeint::controlled_step_result boost::numeric::odeint::controlled_runge_kutta<ErrorStepper>::try_step<void(__cdecl *)(double,double &,double),State>(System,StateInOut &,double &,double &)' being compiled
1>          with
1>          [
1>              ErrorStepper=boost::numeric::odeint::runge_kutta_dopri5<double>,
1>              State=double,
1>              System=void (__cdecl *)(double,double &,double),
1>              StateInOut=double
1>          ]
1>          C:\boost_1_55_0\boost/numeric/odeint/integrate/integrate_adaptive.hpp(44) : see reference to function template instantiation 'size_t boost::numeric::odeint::detail::integrate_adaptive<Stepper,void(__cdecl *)(double,double &,double),State,Time,void(__cdecl *)(const double &,double)>(Stepper,System,State &,Time &,Time,Time &,Observer,boost::numeric::odeint::controlled_stepper_tag)' being compiled
1>          with
1>          [
1>              Stepper=boost::numeric::odeint::controlled_runge_kutta<boost::numeric::odeint::runge_kutta_dopri5<double>>,
1>              State=double,
1>              Time=double,
1>              System=void (__cdecl *)(double,double &,double),
1>              Observer=void (__cdecl *)(const double &,double)
1>          ]
1>          test_odeint.cpp(31) : see reference to function template instantiation 'size_t boost::numeric::odeint::integrate_adaptive<boost::numeric::odeint::controlled_runge_kutta<ErrorStepper>,void(__cdecl *)(double,double &,double),double,double,void(__cdecl *)(const double &,double)>(Stepper,System,State &,Time,Time,Time,Observer)' being compiled
1>          with
1>          [
1>              ErrorStepper=boost::numeric::odeint::runge_kutta_dopri5<double>,
1>              Stepper=boost::numeric::odeint::controlled_runge_kutta<boost::numeric::odeint::runge_kutta_dopri5<double>>,
1>              System=void (__cdecl *)(double,double &,double),
1>              State=double,
1>              Time=double,
1>              Observer=void (__cdecl *)(const double &,double)
1>          ]
1>C:\boost_1_55_0\boost/range/iterator.hpp(63): error C2039: 'type' : is not a member of 'boost::mpl::eval_if_c<C,F1,F2>'
1>          with
1>          [
1>              C=false,
1>              F1=boost::range_const_iterator<double>,
1>              F2=boost::range_mutable_iterator<double>
1>          ]
1>          C:\boost_1_55_0\boost/numeric/odeint/algebra/range_algebra.hpp(52) : see reference to class template instantiation 'boost::range_iterator<C>' being compiled
1>          with
1>          [
1>              C=double
1>          ]
1>C:\boost_1_55_0\boost/numeric/odeint/algebra/range_algebra.hpp(52): error C2664: 'boost::numeric::odeint::detail::for_each3' : cannot convert parameter 1 from 'boost::type' to 'boost::type'
1>          The target type has no constructors
1>C:\boost_1_55_0\boost/numeric/odeint/algebra/range_algebra.hpp(130): error C2664: 'boost::numeric::odeint::detail::reduce' : cannot convert parameter 1 from 'boost::type' to 'boost::type'
1>          The target type has no constructors
1>          C:\boost_1_55_0\boost/numeric/odeint/stepper/controlled_runge_kutta.hpp(84) : see reference to function template instantiation 'Value boost::numeric::odeint::range_algebra::reduce<double,Err,boost::numeric::odeint::default_operations::maximum<Value>>(const S &,Red,Value)' being compiled
1>          with
1>          [
1>              Value=double,
1>              Err=double,
1>              S=double,
1>              Red=boost::numeric::odeint::default_operations::maximum<double>
1>          ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

最佳答案

它成功了。我用这一行:

// state_type = value_type = deriv_type = time_type = double
typedef runge_kutta_dopri5< double , double , double , double , vector_space_algebra , default_operations , never_resizer > stepper_type;

替换此行:

// state_type = double
typedef runge_kutta_dopri5< double > stepper_type;

现在已经修复了。基本上,该示例已过时,示例代码文件夹中有正确的代码。

关于c++ - boost odeint 包示例代码中出现错误 C2309,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21342636/

相关文章:

c++ - 线程库的奇怪行为

c++ - 条件c++中对象的实例化

c++ - 如何在阅读时获取套接字流的位置

c++ - 在 boost::property_tree::read_xml 中捕获异常

c++ - 将 boost odeint 与 std::map 和自定义 vector 空间代数一起使用时,没有可行的重载 '='

c++ - 在 C++ 中扩展 C 结构

c++ - 为什么我不支持 Xcode 1.5?

c++ - Wt::Http::Client 总是以 throw_exception<boost::bad_weak_ptr>() 结束

c++ - 停止与推力一起使用的 odeint 集成

c++ - 带 odeint 的两点边界