Почему нельзя вывести аргумент шаблона?

Я использую odeint из библиотеки boost и как новичок в C++ не понимаю, в чем проблема. Учитывая следующий исходный код в файле с именем ODESystem.hpp

#include "blaze/Math.h"
class ODESystem {
    public:
        using Complex = std::complex< Float >;
        using StateVector = blaze::DynamicVector< Complex,
                                                  blaze::columnVector >;


        void operator()(const StateVector &x, StateVector &dxdt, const double t);
};

void ODESystem::operator()(const ODESystem::StateVector &x, ODESystem::StateVector &dxdt, const double t) {
        // don't do anything here.
    }

а так же простой вызов в main.cpp на odeint через

#include <boost/numeric/odeint.hpp>
int main(int argc, char** argv) {
    ODESystem::StateVector h( 3UL, 7.0F );
    // ODESystem sys is properly initialized beforehand
    boost::numeric::odeint::integrate(sys, h,0.,10.,.1);
}

Я не понимаю, почему компилятор говорит мне

/usr/local/include/boost/numeric/odeint/integrate/integrate.hpp(53): примечание: этот кандидат был отклонен, поскольку не удалось вывести по крайней мере один аргумент шаблона. end_time , Time dt , Наблюдатель-наблюдатель )

Из того, что я читал здесь в подобных сообщениях, это должно быть связано с невыводимым контекстом, но я просто недостаточно знаю, чтобы увидеть, где это применимо здесь.


person pbx    schedule 22.08.2018    source источник
comment
Невозможно ответить без MCVE.   -  person SergeyA    schedule 22.08.2018
comment
На самом деле я думал, что это MCVE. Я ошибся? Просто включите blaze и boost в исходный код и скомпилируйте его. Тогда ошибка должна появиться. Я могу быть не прав. Если да, пожалуйста, сузьте то, что необходимо дальше.   -  person pbx    schedule 22.08.2018
comment
MCVE — это то, что можно скопировать из вашего примера и вставить в редактор, а затем скомпилировать.   -  person SergeyA    schedule 22.08.2018
comment
Я могу что-то упустить, но я думаю, что это должно работать сейчас, пока в системе доступны blaze и boost.   -  person pbx    schedule 22.08.2018


Ответы (1)


С некоторыми изменениями это прекрасно компилируется

#include <complex>
#include <vector>
#include <boost/numeric/odeint.hpp>

class ODESystem {
public:
    using Complex =  float ;
    using StateVector = std::vector<Complex>;
    void operator()(const StateVector &x, StateVector &dxdt, const double t)
    {}
};
bool operator>(const std::complex< float > & f, const std::complex< float > & d)
{
    return false;
}
int main(int argc, char *argv[])
{
    ODESystem sys;
    ODESystem::StateVector h(3UL, 7.0F);
    // ODESystem sys is properly initialized beforehand
    boost::numeric::odeint::integrate(sys, h, 0., 10., .1);
}

просто меняю на

using Complex =  std::complex<float> ;

и у вас будут проблемы, потому что вам придется дорабатывать оператор> для сложного и мощного...

Что касается вашей ошибки компиляции, вы забыли заголовок blaze?

person PilouPili    schedule 22.08.2018