gpt4 book ai didi

c++ - 无法转换 boost::lambda::placeholder1_type

转载 作者:太空狗 更新时间:2023-10-29 23:04:09 25 4
gpt4 key购买 nike

我正在尝试使用 boost::lambda,但我遇到了一个我不知道如何解决的错误。

我觉得这是一个初学者错误,所以请原谅我的无知(而且,我不得不承认,我的懒惰也没有阅读整个 boost lamda 文档)。

似乎在某些情况下使用 boost::bind(或者可能是 boost::lambda::bind?),比 boost::lambda 更适合,但我不确定它是否可以在这里应用。我不想为 if cond(arg1) arg2.insert(arg1) ; 编写一个单独的函数,因为它会破坏目的;我猜它不会比仿函数好多少。

我在工作中使用 VC9 的 boost 1.35。错误出现在 cond()insert() 调用站点:“C2664:无法从‘boost::lambda::placeholder1_type’转换参数 1”

我在我的 cygwin 上用 g++ 复制了这个片段的问题。

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

#include <boost/foreach.hpp>
#include <iostream>
#include <set>

void work( boost::function<void(long)> doAction ) {
long results[] = { 2, 5, 4 };
BOOST_FOREACH( long r, results )
doAction( r );
}

bool cond( long r ) { return r % 2 == 0 ; }

int main() {
using namespace boost::lambda;
std::set<long> myResults;
work(
if_then( cond(_1) , boost::ref(myResults).get().insert(_1) ) );

BOOST_FOREACH( long r, myResults )
std::cout << r << "\n";
}

g++ 错误:

lambda_test.cpp: In function ‘int main()’:
lambda_test.cpp:21:19: error: cannot convert ‘boost::lambda::placeholder1_type {aka const boost::lambda::lambda_functor<boost::lambda::placeholder<1> >}’ to ‘long int’ for argument ‘1’ to ‘bool cond(long int)’
if_then( cond(_1) , boost::ref(myResults).get().insert(_1) ) );
^
lambda_test.cpp:21:60: error: no matching function for call to ‘std::set<long int>::insert(boost::lambda::placeholder1_type&)’
if_then( cond(_1) , boost::ref(myResults).get().insert(_1) ) );

如有任何帮助,我们将不胜感激

谢谢

最佳答案

您将延迟执行与即时评估混合在一起:

boost::ref(myResults).get().insert(_1)

在这里,boost::ref(myResults)不懒惰,所以.get()也不是。 boost::ref(myResults).get() 的类型只是 std::set<long> & , 而那个类型的 insert成员函数没有采用 Boost Lambda 占位符的重载。

我(不再)精通 Boost Lambda,因为我已经转到它的后继库 Boost Phoenix。这是带有修复的一对一翻译: Live On Coliru

#include <boost/phoenix.hpp>

#include <boost/foreach.hpp>
#include <iostream>
#include <set>

template <typename Action>
void work( Action doAction ) {
long results[] = { 2, 5, 4 };
BOOST_FOREACH( long r, results )
doAction( r );
}

bool cond( long r ) { return r % 2 == 0 ; }


int main() {
namespace phx = boost::phoenix;
using namespace phx::placeholders;

std::set<long> myResults;
work(
if_(phx::bind(cond, _1)) [ phx::insert(phx::ref(myResults), _1) ] );

BOOST_FOREACH( long r, myResults )
std::cout << r << "\n";
}

打印

2
4

我建议查看 Phoenix 函数适配,以避免绑定(bind)表达式:

关于c++ - 无法转换 boost::lambda::placeholder1_type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23607508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com