0

以下代码给出了由第 17 行引起的编译错误:

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

void func()
{}

class A{
public:

    template <typename T>
    static void foo(T const& arg){}

    template <typename T>
    void bar(T const& arg){
        boost::bind(&A::foo<T>, arg);  //OK
        boost::function<T> functor1 = boost::bind(func); //OK
        boost::function<T> functor2 = boost::bind(&A::foo<T>, arg); //ERROR, LINE 17
    }
};

int main()
{
    A obj1;
    obj1.bar(func);
}

问题是,第 17 行的 functor2 原型应该是什么?
如果我真的想保持 functor2 的原型为“boost::function<void()>”,如何让 boost::bind 返回这样的类型?

编译错误是:usr/include/boost/bind/bind.hpp:253: error: invalid initialization of reference of type 'void (&)()' from expression of type 'void (*)()'
什么意思?

4

3 回答 3

3

foo(T const& arg)接受一个参考参数。为了通过 传递引用参数boost::bind,您需要用boost::ref.

boost::function<T> functor2 = boost::bind(&A::foo<T>, boost::ref(arg));
于 2012-10-01T19:09:00.243 回答
0

看看boost::bind 的返回类型是什么?

简而言之,我只想写

auto functor2 = boost::bind(&A::foo<T>, arg);

并使用 gcc 4.6+ 或带有--std=gnu++0x选项的 gcc 4.4 编译它。

于 2012-04-11T20:05:57.727 回答
0

我对绑定没有经验,但是您通常不需要调用成员函数的类的实例吗?如果您不将其包含在绑定中,则需要将其包含在调用站点中。使用auto我的例子(我在上面读到你不能使用它,但我会为了简洁起见),我将重新实现你的 A::bar() 方法:

void bar(T const& arg){
    auto barebones = boost::bind(&A::foo<T>, arg);
    // OR
    auto barebones = boost::bind(&A::foo<T>, _1, arg);
    barebones(this); // Need an instance, or a pointer to an instance of A
    boost::function<T> functor1 = boost::bind(func); // OK because func is a bare function with no arguments
    boost::function<T> functor2 = boost::bind(&A::foo<T>, this, arg); // betting that would work
    functor2(); // with my modification, I think that'll work.
}

您可能需要 _1 语法来说明第一个参数占据了那个位置,或者没有它也可以工作。我不是 100% 确定(还没有编译它),但是根据 boost 站点上的文档(boost bind doc,boost mem_fn doc),这就是我认为正在发生的事情。

为什么编译第一部分,我不知道。这让我怀疑原来的语法没问题,但是你需要传递类实例。如果您正在寻找不需要额外参数的“裸”可调用对象,则需要在绑定时传递一个实例(或指向一个的指针,或指向一个的智能指针)。

如果您在推断类型时遇到问题,请尝试使用 BOOST_AUTO() 宏。 文档链接

于 2012-04-11T22:12:54.107 回答