std::find_if() Aufruf von IsOdd aus Klasse



  • Hallo Cummunity,

    ich versuche gerade aus einem Vector mit der Funktion 'std::find_if(...)' zu arbeiten.
    Dabei stellt sich bei mir die Frage ob ich die 'IsOdd(..)' Funktion in Header der Klasse deklariern kann, damit diese auf Eigenschaften der Klasse zugreifen kann...

    Hier mal der Code um das etwas zu verdeutlichen:
    Die Header-Datei myClass.h:

    #ifndef __myClass__
    #define __myClass__
    
    // Header
    #include <wx/wx.h>
    #include <vector>
    
    typedef std::pair<unsigned long, wxString> vInlay;
    typedef std::vector<vInlay> listeStore;
    
    class myClass
    {
    private:
    	unsigned long searchFor;
    protected:
    	listeStore liste;	// Der Vector
    public:
    	/* c'tor */
    	myClass();
    
    	// Etwas suchen
    	bool ValueInListeGot(unsigned long toFind);
    
    protected:
    	// IsOdd Funktion
    	bool IsOdd(vInlay inlay);
    };
    
    #endif // __myClass__
    

    Die cpp Datei myClas.cpp

    // eigener Header
    #include "myClass.h"
    
    // Header aus Header
    #include <wx/wx.h>
    #include <vector>
    
    // weitere Header
    #include <algorithm>
    
    /* c'tor */
    myClass::myClass()
    {
    	// VersuchVector mit inhalt befüllen
    	for (unsigned long v=1; v<50; v++)
    	{
    		wxString str;
    		str << _T("Value_") << v;
    		vInlay in(v, str);
    		liste.push_back(in);
    	}
    }
    
    // Etwas suchen
    bool myClass::ValueInListeGot(unsigned long toFind)
    {
    	listeStore::iterator itFind;
    	searchFor = toFind;
    	itFind = std::find_if(liste.begin(), liste.end(), IsOdd); // hier wirft er sich mit Fehlermeldung
    	if (itFind != liste.end())
    	{
    		return true;
    	}
    	return false;
    }
    
    // IsOdd Funktion
    bool myClass::IsOdd(vInlay inlay)
    {
    	if (inlay.first == searchFor)
    		return true;
    	return false;
    }
    

    Wenn ich die 'IsOdd(...)' Klasse nicht in die 'myClass' lege, (und natürlich die 'searchFor' z.B. in einem namespace statisch initalisiere), funktioniert der ganze Spaß.

    Die Frage wo sich jetzt hierbei bei mir stellt ist, ist es möglich diese 'IsOdd(...)'-Funktion in myClass zu bekommen.

    Habe auch schon Sachen versucht wie:

    itFind = std::find_if(liste.begin(), liste.end(), &IsOdd);
    itFind = std::find_if(liste.begin(), liste.end(), myClass::IsOdd);
    itFind = std::find_if(liste.begin(), liste.end(), &myClass::IsOdd);
    

    Besten Dank und fröhliches proggen...
    Ollow


  • Mod

    Template Funktionen müssen zur Gänze während der Compile-Zeit des entsprechenden templates bekannt sein. Also die Funktion IsOdd muss mit in der Klasse liegen oder im Header als inline.

    Auslagern in CPP Module ist so nicht möglich.



  • Zusätzlich muss die Funktion statisch / global sein, bzw. besser gerade einen Funktor machen.

    Simon



  • Besten Dank für schnellen Antworten.... 👍

    Mfg
    Ollow


Anmelden zum Antworten