boost :: lambda выражение не компилируется - PullRequest
4 голосов
/ 01 апреля 2010

Я попытался написать функцию, которая вычисляет расстояние Хэмминга между двумя кодовыми словами с использованием библиотеки лямбда-выражений У меня есть следующий код:

#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*)

Я впервые играю с буст-лямбдой. Пожалуйста, скажите мне, где я иду не так. Спасибо.

EDIT:

Большое спасибо, ребята! Вот рабочий код (только для справки):

#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 ]

5 голосов
/ 01 апреля 2010

Первая проблема: при использовании boost/lambda включайте <boost/lambda/bind.hpp> вместо <boost/bind.hpp>

Вторая проблема: вам нужно using namespace boost::lambda после того, как # включает

все еще не компилируется, хотя


Edit:
Третья проблема - вам нужно 6 аргументов для std::inner_product, вам не хватает аргумента инициализации. вероятно, добавьте 0 в качестве четвертого аргумента.

1 голос
/ 01 апреля 2010

Я могу ошибаться, но я думаю, что вы должны иметь using namespace boost::lambda;, прежде чем ваша функция в качестве заполнителей (_1, _2 и т. Д.) Окажется в этом пространстве имен.

...