以下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 :(得分:3)
该绑定表达式的结果类型为int
(或更确切地说是const int&
)。我想你可以override the return type:
boost::bind<int&>(&A::data, _1)(a) = 1;
答案 1 :(得分: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;
}
答案 2 :(得分: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是更好的选择。