как использовать систему тегов odeint для выполнения определенной работы для различных типов степперов

У меня есть шаблонный класс, который может выполнять некоторую работу с классами степперов odeint, и я хочу, чтобы это была конкретная (разная) работа для каждой из категорий степперов.

/// header file ///

template<class Stepper>
class foo {
typedef typename boost::numeric::odeint::unwrap_reference< Stepper >::type::stepper_category stepper_category;
void do_work(double param);
// specific functions for various stepper types
void do_specific_work(double param, stepper_category);
}

/// cpp file ///
template<class Stepper>
void foo<Stepper>::do_work(double param)
{
do_specific_work(param, stepper_category());
}

// actual implementation of work for any stepper (i.e. exposing the basic functionality of stepper_tag)
template<class Stepper>
void foo<Stepper>::do_specific_work(double param, boost::numeric::odeint::stepper_tag)
{ ... }

// actual implementation of work for dense output stepper (i.e. exposing the functionality of dense_output_stepper_tag)
template<class Stepper>
void foo<Stepper>::do_specific_work(double param, boost::numeric::odeint::dense_output_stepper_tag)
{ ... }

Проблема в том, что я получаю следующую ошибку компилятора:

error C2244: 'foo<Stepper>::do_specific_work' : unable to match function definition to an existing declaration `

Я пытался сделать это так же, как методы, такие как integrate_adaptive реализованы, разница с моим случаем заключается в том, что это отдельные функции (не члены какого-либо класса), и они не нуждаются в предварительном объявлении. Как изменить код для достижения того, что мне нужно?
заранее спасибо!

1

Решение

Вы должны предоставить явные перегрузки для определенных категорий:

template<class Stepper>
class foo {
typedef typename boost::numeric::odeint::unwrap_reference< Stepper >::type::stepper_category stepper_category;

// ...void do_specific_work(double param, stepper_tag );
void do_specific_work(double param, dense_output_stepper_tag );
};

template< class Stepper >
void foo< Stepper >::do_specific_work( double param , stepper_tag )  { ... };

template< class Stepper >
void foo< Stepper >::do_specific_work( double param , dense_output_stepper_tag )  { ... };

У вас есть одно объявление do_specific_work (double param, stepper_category) и несколько определений. Ваш прототип не соответствует определению прямо сейчас.

1

Другие решения

// actual implementation of work for any stepper (i.e. exposing the basic functionality of stepper_tag)

Если вы хотите, чтобы этот метод работал с любым stapper_tag, чем использовать шаблон функции:

template<class StepperTag>
void do_specific_work(double param, StepperTag stepper);

И реализация:

template<class Stepper>
template<class StepperTag>
void foo<Stepper>::do_specific_work(double param, StepperTag stepper)
{ ... }

template<class Stepper>
void foo<Stepper>::do_specific_work(double param, boost::numeric::odeint::dense_output_stepper_tag stepper)
{ ... }
1

По вопросам рекламы [email protected]