Probleme mit Lamdda bei find_if zum Durchsuchen eines Vectors



  • Hallo,

    ich habe gerade ein Verständnis beim Durchsuchen eines std::vector. Normaler Weise klappt es immer problems mit Lamddas. nur diesmal muss ich innerhalb des Lamddas auf eine Memberfunktion der Klasse zugreifen.

    Ich habe die Problemstellung mit dem folgden Programm nachgestellt.

    #include <algorithm>
    #include <vector>
    
    using namespace std;
    
    class test
    {
      vector<int> v;
    
      int umwandel(const int i) {return i * 10;}
    
    public:
      test(const int i1, const int i2, const int i3, const int i4, const int i5)
      {
        v.push_back(i1);
        v.push_back(i2);
        v.push_back(i3);
        v.push_back(i4);
        v.push_back(i5);
      }
    
      void foo(const int i)
      {
         auto it = find_if(begin(v), end(v), [&](const int id) -> bool {
            return umwandel(id) = i;
         });
         if (it != end(v))
         {
            // do something
         }
       }
    };
    
    int main()
    {	
      test t(1, 2, 3, 4, 5);
      t.foo(10);
    }
    

    Hier liefert mir VS 2010 jetzt in Zeile 25 die Fehlermeldung

    "error C2106: '=': Linker Operand muss ein L-Wert sein"

    Es ist mir klar, weil umwandeln gehört zur Klasse test.

    Wie kann ich hier nach dem Wert suchen, eine Lösung mit einer For schleife zum Durchlaufen der Schleife ist mir bekannt.

    Danke



  • Du möchtest wohl

    return umwandel(id) == i;
    


  • [this]
    


  • Mist! Tippfehler! Ja jetzt läuft mein Testprogramm!

    icarus2 schrieb:

    Du möchtest wohl

    return umwandel(id) == i;
    

  • Mod

    Ich kann mir nur sehr schwer vorstellen dass du Lambdas verwendest, aber einen so banalen Syntax-Fehler nicht (selber) findest.

    Außerdem ist dein Lambda-Capture mMn. nicht optimal. Es muss i capturen - das kann aber by copy geschehen, wodurch die unnötige Indirektion schwindet. Ebenso wie bei this . Also sollte der capture-default zu = geändert werden. Somit kann das Ganze zu

    [=] (int id) {return umwandel(id) == i;}
    

    verkürzt werden.

    [i, this] (int id) {return umwandel(id) == i;}
    

    ist auch möglich (und wird von einigen bevorzugt).



  • Hallo,

    sorry, aber beim Versuch ein minimales Testbeispiel zu schreiben, ist mir Tippfehler unterlaufen.

    Das reale Programm ist viel, viel komplexer. MFC Programm und bei der abgeleiteten Funktion handelt es sich um GetDlgItem. Das find_if wird benutzt in einer Klasse die von CDialogEx abgeleitet wurde. Den Code kann ich hier aber nicht reinsetzen.

    Suche ich halt weiter und benutze die for-Schleife. Wollte halt was lernen.

    Arcoth schrieb:

    Ich kann mir nur sehr schwer vorstellen dass du Lambdas verwendest, aber einen so banalen Syntax-Fehler nicht (selber) findest.

    Außerdem ist dein Lambda-Capture mMn. nicht optimal. Es muss i capturen - das kann aber by copy geschehen, wodurch die unnötige Indirektion schwindet. Ebenso wie bei this . Also sollte der capture-default zu = geändert werden. Somit kann das Ganze zu

    [=] (int id) {return umwandel(id) == i;}
    

    verkürzt werden.

    [i, this] (int id) {return umwandel(id) == i;}
    

    ist auch möglich (und wird von einigen bevorzugt).


Anmelden zum Antworten