2009-08-12 6 views
1

私は以下のコードでcopy_ifをエミュレートしようとしていますが、私のコンパイラ(g ++ - 4.0)は不平を続けています。技術的に間違っているのは何ですか?ご協力いただきありがとうございます!参考のためboost :: lambda :: if_then for copy_if

template <class STL> // a std container of class A, but I don't know if it's a list or vector or deque 
void export_(STL& Alist) { //a member function 
    for_each(Alist0.begin(), Alist0.end(), //member data 
     boost::lambda::if_then(
      boost::lambda::bind(&A::get_StatusTag, boost::lambda::_1) == OK, //some global enum returned by A::get_StatusTag 
      boost::lambda::bind(&STL::push_back, Alist, boost::lambda::_1) 
     ) 
    ); 
} 
+3

ポストコンパイルエラー。 –

+0

コンパイルエラーメッセージを投稿して手がかりを与えると助けになるでしょう。 – Glen

+2

あなたの例の各式は、それぞれ独自の式で表現できます。したがって、順番にそれぞれを取って、それの後にセミコロンを入れてください。これは、問題の原因を絞り込むのに役立ちます。たとえば、次のように記述します。(boost :: lambda :: bind(&A :: get_StatusTag、boost :: lambda :: _ 1)== OK); –

答えて

1

、ここで次にあなたが好きそれを使うだろうhttp://www.richelbilderbeek.nl/CppCopy_if.htm

template<typename In, typename Out, typename Pred> 
Out copy_if(In first, In last, Out res, Pred Pr) 
{ 
    while (first != last) 
    { 
    if (Pr(*first)) 
     *res++ = *first; 
    ++first; 
    } 
    return res; 
} 

から取られ、copy_ifのより正常な実装です:

もちろんのラインIと仮定すると
template <typename BackInsertionSequence> 
void export_(BackInsertionSequence &Alist) { 
    copy_if(AList0.begin(), AList0.end(), std::back_inserter(Alist), 
     boost::lambda::bind(&A::get_StatusTag, boost::lambda::_1) == OK 
    ); 
} 

あなたのコードで失敗した行はコピーされていません。

0

私の推測では、コンパイラは、バインドオブジェクトではなく_1から右オペレータの方法を見つけることができないかしらライン

boost::lambda::bind(&A::get_StatusTag, boost::lambda::_1) == OK 

を好きではないです。別のラムダ式でラップしてみてください。それの

と思いますこのよう:

(_1 == OK)(boost::lambda::bind(&A::get_StatusTag, boost::lambda::_1)) 
+0

ヘッダーを含めると、コンパイラは最初のステートメントを処理できます。 – SYK

5

ラムダ::バインドがコピーによってバインドします。したがって、式bind(&STL::push_back, AList, _1)は、のコピーを作成し、のAListを作成します。このファンクタのoperator()はconstなので、constオブジェクト(その内部コピー)に対して非constメンバ(push_back)を呼び出すため、適用が失敗します。

ソリューション:バインド連想リストへ参照に、使用して:bind(&STL::push_back, boost::ref(AList), _1)

関連する問題