3

以下来自 boost bind 的示例对我不起作用:

#include <boost/bind.hpp>

struct A
{
    int data;
};

int main()
{
    A a;
    boost::bind(&A::data, _1)(a) = 1;
}

error: assignment of read-only location 'boost::bind [with A1 = boost::arg<1>, M = int, T = A](&A::data, (<unnamed>::_1, boost::arg<1>())).boost::_bi::bind_t<R, F, L>::operator() [with A1 = A, R = const int&, F = boost::_mfi::dm<int, A>, L = boost::_bi::list1<boost::arg<1> >](((A&)(& a)))'

我做错什么了吗?编译器是g++ 4.4.0

4

3 回答 3

3

该绑定表达式的结果类型是int(或者更确切地说const int&)。我认为您可以覆盖返回类型

boost::bind<int&>(&A::data, _1)(a) = 1;
于 2010-02-14T21:03:11.283 回答
2

UncleBens 的解决方案很好,但我想我会补充一点,如果您使用 Boost.Lambda,问题就会消失:

#include <boost/lambda/bind.hpp>

struct A {
    int data;
};

int main() {

    namespace bll = boost::lambda;

    A a;
    bll::bind(&A::data, bll::_1)(a) = 1;
}

如果你使用它也会这样做boost::mem_fn

#include <boost/mem_fn.hpp>

struct A {
    int data;
};

int main() {

    boost::mem_fn(&A::data)(a) = 1;
}
于 2010-02-15T07:02:23.277 回答
1

我不确定你想做什么,但是 Boost.Bind 真的重载了赋值运算符吗?如果您想使用返回的函数对象将值 1 分配给 a.data,我认为您需要执行以下操作(另请注意,“a”需要通过引用绑定):

#include <boost/bind.hpp>
#include <boost/ref.hpp>
#include <cassert>

void foo()
{
    A a;

    boost::bind(&A::data, _1)(boost::ref(a), 1);

    assert(a.data == 1);
}

如果您需要使用赋值运算符,我认为使用 Boost.Lambda 或 Boost.Phoenix 会是更好的选择。

于 2010-02-15T08:09:00.527 回答