привязка функции boost скомпилирована с ошибкой преобразования - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть следующий код

#include <boost/function.hpp>
#include <boost/bind.hpp>

class Foo {    
    public:
    int getIfoo();
};

int Foo::getIfoo() {
    return 5;
}

int main () {

    boost::function<int (Foo)> getIntFoo;
    getIntFoo = boost::bind( &Foo::getIfoo, _1 );

    return 0;
}

Когда я компилирую следующую команду g++ TestBoostBind.cpp У меня появляется следующая ошибка

/includes/boost_1_60_0/boost/bind/mem_fn_template.hpp:35:36: error: invalid conversion from ‘const Foo*’ to ‘Foo*’ [-fpermissive]
         BOOST_MEM_FN_RETURN (u.*f_)();
                             ~~~~~~~^~

Я не совсем понимаю источник ошибки, исходит ли она из моего кода или из библиотеки наддува. Кто-нибудь знает, что означает ошибка и как ее исправить? Я использую g ++ (Ubuntu 7.3.0-27ubuntu1 ~ 18.04) 7.3.0 и boost.1.60

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Вы можете попытаться использовать std::mem_fn для достижения той же цели:

Foo f; std::function<int(Foo &)> getIntFoo = std::mem_fn(&Foo::getIfoo); int ret = getIntFoo(f);

или, если вам нужен аргумент-указатель, std :: function может решить это за вас:

Foo f; std::function<int(Foo *)> getIntFoo = std::mem_fn(&Foo::getIfoo); int ret = getIntFoo(&f);

boost имеет собственную альтернативу

0 голосов
/ 13 ноября 2018

При привязке к функции-члену первым аргументом должен быть указатель или ссылка на объект, для которого вызывается функция. Это не может быть значение (фактический экземпляр объекта). Функция boost::bind имеет особые случаи для этих двух альтернатив для генерации правильных объектов. не имеет какой-либо особый случай для передачи по значению.

Поэтому вам нужно определить getIntFoo как функцию, принимающую указатель на Foo:

boost::function<int (Foo*)> getIntFoo;

Или ссылка :

boost::function<int (Foo&)> getIntFoo;
...