2009-08-12 4 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의보다 일반적인 구현의 당신은 그것을 좋아 사용하십시오 :

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 
    ); 
} 

물론 가정하면 그 라인 I 복사 한 것은 코드에서 실패한 행이 아닙니다.

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를 갖는 펑터를 생성합니다. 이 functor의 operator()는 const이기 때문에 const 객체 (내부 복사본)에 비 const 멤버 (push_back)를 호출하기 때문에 적용이 실패합니다.

솔루션 : 바인드 AList에 참조에 사용 : bind(&STL::push_back, boost::ref(AList), _1)