Boost函数绑定编译时出现转换错误

时间:2018-11-13 13:12:58

标签: c++ boost bind

我有以下代码

#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_)();
                             ~~~~~~~^~

我对错误的来源感到困惑,无论它是最初来自我的代码还是来自boost库。有谁知道错误的含义以及如何解决?我使用g ++(Ubuntu 7.3.0-27ubuntu1〜18.04)7.3.0和boost.1.60

2 个答案:

答案 0 :(得分:4)

绑定到成员函数时,第一个参数必须是对象的 pointer reference ,以调用该函数。具体来说,它不能是值(实际的对象实例)。 boost::bind函数在这两种选择中都有特殊情况,以生成正确的对象。 没有任何特殊情况可以按值传递。

因此,您需要将getIntFoo定义为将 pointer 指向Foo的函数:

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

参考

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

答案 1 :(得分:0)

您可以尝试使用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);

有自己的选择