4

ブーストラダライブラリを使用して、2つのコードワード間のハミング距離を計算する関数を作成しようとしました。私は次のコードを持っています:

#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 ‘&lt;unnamed>::_1 + <unnamed>::_2’
HammingDistance.cpp:17: error: no match for ‘operator!=’ in ‘&lt;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*)

ブーストラダムで遊ぶのはこれが初めてです。どこが悪いのか教えてください。ありがとう。

編集:

どうもありがとう!作業コードは次のとおりです(参照用)。

#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;
}
4

2 に答える 2

5

最初の問題:を使用する場合、代わりにboost/lambdaインクルードする<boost/lambda/bind.hpp><boost/bind.hpp>

using namespace boost::lambda2番目の問題: #includesの後にaが必要です

それでもコンパイルされません


編集:
3番目の問題-には6つの引数が必要std::inner_productですが、初期化引数がありません。0おそらく4番目の引数として追加します。

于 2010-04-01T09:12:57.413 に答える
1

using namespace boost::lambda;私は間違っている可能性がありますが、プレースホルダー(_1、_2など)がその名前空間にあるため、関数の前に持っている必要があると思います。

于 2010-04-01T09:11:08.893 に答える