2009-08-12 5 views
1

J'ai essayé d'émuler un copy_if par les codes suivants mais mon compilateur (g ++ - 4.0) continue de se plaindre. Qu'est-ce qui ne va pas techniquement? Merci de votre aide!boost :: lambda :: if_then pour 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

Publier les erreurs du compilateur. –

+0

il serait utile si vous avez posté le message d'erreur du compilateur pour nous donner un indice ... – Glen

+2

Chaque expression dans votre exemple peut apparaître comme une déclaration d'expression dans son propre droit. Par conséquent, prenez chacun à son tour et placez un point-virgule après. Cela devrait aider à affiner la cause de votre problème. Par exemple mettre le suivant de son propre chef: (boost :: lambda :: bind (& A :: get_StatusTag, boost :: lambda :: _ 1) == OK); –

Répondre

1

Pour référence, voici une application plus normale de copy_if, pris de 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; 
} 

alors vous l'utiliser comme:

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

En supposant bien sûr que la ligne I 'ai copié n'est pas la ligne qui échoue dans votre code.

0

Je pense que le compilateur n'aime pas la ligne

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

Je me demande si elle est ne pas trouver la méthode de l'opérateur à droite de l'objet de liaison et non le _1. Vous devriez essayer de l'emballer dans une autre expression lambda.

penser de cette façon:

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

Le compilateur peut gérer la première instruction si vous incluez l'en-tête . – SYK

5

lambda :: bind lie par copie. L'expression bind(&STL::push_back, AList, _1) crée ainsi un foncteur contenant une copie de AList. Comme l'opérateur de ce foncteur() est const, l'application échoue car il finit par appeler un membre non-const (push_back) sur un objet const (sa copie interne).

Solution: se lient à une référence à AList, en utilisant: bind(&STL::push_back, boost::ref(AList), _1)