如何编译?错误是当我开始使用boost :: ref()时。我以为boost :: ref用于传递对C ++算法类的引用?
list<Object> lst;
lst.push_back(Object(1,2.0f));
lst.push_back(Object(3,4.3f));
struct between_1_and_10
{
int d;
void operator() (Object& value)
{
value.a += 5; value.b -= 3.3f;
cout << d << endl;
d += value.a;
}
};
between_1_and_10 val;
val.d = 4;
for_each(lst.begin(), lst.end(), boost::ref(val)); // Problem is here
printf("rg");
编辑以下是人们建议的编译错误:
1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\algorithm(29) : error C2064: term does not evaluate to a function taking 1 arguments
1> c:\users\swangrun\desktop\minescout work\feat-000-gettargetimages\minescouttest\maintest.cpp(102) : see reference to function template instantiation '_Fn1 std::for_each<std::list<_Ty>::_Iterator<_Secure_validation>,boost::reference_wrapper<T>>(_InIt,_InIt,_Fn1)' being compiled
1> with
1> [
1> _Fn1=boost::reference_wrapper<main::between_1_and_10>,
1> _Ty=Object,
1> _Secure_validation=true,
1> T=main::between_1_and_10,
1> _InIt=std::list<Object>::_Iterator<true>
1> ]
答案 0 :(得分:12)
boost::reference_wrapper
(boost::ref
返回的内容)不会重载operator()
。您可以将boost::bind
与ref
一起使用,它具有特殊的处理方式(不使用bind
会使for_each
复制提供的函数对象)。
但是between_1_and_10 val;
val.d = 4;
val = for_each(lst.begin(), lst.end(), val);
printf("rg");
返回它调用东西的函数对象。所以就这样做
val
它将调用复制的boost::ref
上的内容,并在最后一次调用后返回函数对象。
只是告诉你在哪里使用void g(int &i) { i++; }
template<typename T>
void run_g(T t) { g(t); }
,因为你似乎在滥用它。想象一个模板,它按值获取其参数,并调用另一个函数:
boost::reference_wrapper
如果您现在想要使用变量调用它,它将复制它。通常,这是一个合理的决定,例如,如果您想将数据作为启动参数传递给线程,则可以将其从本地函数复制到线程对象中。但有时,您可能希望不复制它,而是实际传递引用。这是1
帮助的地方。以下实际上是我们所期望的,并输出int main() {
int n = 0;
run_g(boost::ref(n));
std::cout << n << std::endl;
}
:
T
对于绑定参数,副本是一个很好的默认值。它也很容易使数组和函数衰减到指针(通过引用接受会使{{1}}成为数组/函数类型,并会导致一些讨厌的问题)。
答案 1 :(得分:7)
这就是你真正想要的:
for_each(lst.begin(), lst.end(), boost::bind<void>(boost::ref(val),_1 ) );
编辑:对OP的要求作出一些解释。回想一下for_each()接受一个函数,但你只是传递了一个对你的struct的引用(是的,结构有它的operator()重载但是你没有传递它)。 bind()基本上“暴露”你的struct中的函数。
EDIT2:“_ 1”的说明可以在下面的评论中找到。
答案 2 :(得分:-1)
不使用boost :: ref。
尝试