2010-02-14 49 views
3

以下example from 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

+0

刚刚意识到以上示例链接后面的内容:您正在尝试使用Boost.Bind遵循Boost.Lambda绑定表达式示例。尝试包括,并使用boost :: lambda :: bind + boost :: lambda :: _ 1来代替。另外,使用boost :: lambda :: var来保存一个引用。 – rjnilsson

回答

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; 
} 
3

该绑定表达式的结果类型是int(或者更确切地说是const int&)。我想你可以override the return type

boost::bind<int&>(&A::data, _1)(a) = 1; 
1

我不知道你想做的事,但真正Boost.Bind重载赋值运算符?如果您想使用返回的函数对象,我认为你需要做这样的事情(也指出,“一个”需要通过参考约束)的值1分配给a.data:

#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将是更好的选择。