boost :: lambda表达式无法编译

时间:2010-04-01 09:04:11

标签: c++ boost boost-lambda

我尝试编写一个函数,使用boost lambda库计算两个代码字之间的汉明距离。我有以下代码:

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

template<typename Container>
int hammingDistance(Container & a, Container & b) {
  return std::inner_product(
    a.begin(),
    a.end(),
    b.begin(),
    (_1 + _2),
    boost::lambda::if_then_else_return(_1 != _2, 1, 0)
  );
}

int main() {
  boost::array<int, 3> a = {1, 0, 1}, b = {0, 1, 1};
  std::cout << hammingDistance(a, b) << std::endl;
}

我得到的错误是:

HammingDistance.cpp: In function ‘int hammingDistance(Container&, Container&)’:
HammingDistance.cpp:15: error: no match for ‘operator+’ in ‘<unnamed>::_1 + <unnamed>::_2’
HammingDistance.cpp:17: error: no match for ‘operator!=’ in ‘<unnamed>::_1 != <unnamed>::_2’
/usr/include/c++/4.3/boost/function/function_base.hpp:757: note: candidates are: bool boost::operator!=(boost::detail::function::useless_clear_type*, const boost::function_base&)
/usr/include/c++/4.3/boost/function/function_base.hpp:745: note:                 bool boost::operator!=(const boost::function_base&, boost::detail::function::useless_clear_type*)

这是我第一次玩boost lambda。请告诉我哪里出错了。感谢。

修改

非常感谢!这是工作代码(仅供参考):

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

using boost::lambda::_1;
using boost::lambda::_2;

template<typename Container>
int hammingDistance(Container & a, Container & b) {
  return std::inner_product(
    a.begin(),
    a.end(),
    b.begin(),
    0,
    (_1 + _2),
    boost::lambda::if_then_else_return(_1 != _2, 1, 0)
  );
}

int main() {
  boost::array<int, 3> a = {1, 0, 1}, b = {0, 1, 1};
  std::cout << hammingDistance(a, b) << std::endl;
}

2 个答案:

答案 0 :(得分:5)

第一个问题:使用boost/lambda时,请添加<boost/lambda/bind.hpp>代替<boost/bind.hpp>

第二个问题:#include后需要using namespace boost::lambda

仍然无法编译


编辑:
第三个问题 - 你需要std::inner_product的6个参数,你缺少一个初始化参数。可能会添加0作为第四个参数。

答案 1 :(得分:1)

我可能错了,但我认为你的函数之前应该有using namespace boost::lambda;,因为占位符(_1,_2等)位于该命名空间中。