2009-08-12 11 views
1

Ich habe versucht, ein copy_if durch die folgenden Codes zu emulieren, aber mein Compiler (g ++ - 4.0) beschwert sich nur. Was ist technisch falsch? Danke für Ihre Hilfe!boost :: lambda :: if_then für 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

Beitrag des Compiler-Fehler. –

+0

Es würde helfen, wenn Sie die Compiler-Fehlermeldung gesendet haben, um uns einen Hinweis zu geben ... – Glen

+2

Jeder Ausdruck in Ihrem Beispiel kann als eigenständige Ausdruckanweisung auftreten. Nimm daher nacheinander und lege ein Semikolon dahinter. Dies sollte dazu beitragen, die Ursache Ihres Problems einzugrenzen. Zum Beispiel setzen Sie das folgende für sich selbst: (boost :: lambda :: bind (& A :: get_StatusTag, boost :: lambda :: _ 1) == OK); –

Antwort

1

Als Referenz ist hier eine normalere Umsetzung von copy_if, genommen von 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; 
} 

Dann würde es Ihnen gefällt verwenden:

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

natürlich davon aus, dass die Linie, die ich habe kopiert ist nicht die Zeile, die in Ihrem Code fehlschlägt.

0

Meine Vermutung ist, der Compiler nicht die Linie mag

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

Ich frage mich, wenn es sich nicht die richtigen Operator Methode aus dem bind Objekt zu finden und nicht die _1. Sie sollten versuchen, es in einen anderen Lambda-Ausdruck einzufügen.

Betrachten Sie es auf diese Weise:

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

Der Compiler kann die erste Anweisung verarbeiten, wenn Sie den Header einschließen. – SYK

5

lambda :: bind bindet kopieren. Der Ausdruck bind(&STL::push_back, AList, _1) erzeugt somit einen Funktor, der eine Kopie von AList enthält. Da der Operator operator() dieses Funktors const ist, schlägt das Anwenden fehl, weil es schließlich ein nicht-konstantes Element (push_back) für ein konstantes Objekt (seine interne Kopie) aufruft.

Lösung: Bindung an eine Referenz zu AList, mit: bind(&STL::push_back, boost::ref(AList), _1)

Verwandte Themen