[STL] Funktionszeiger von Memberfunktion



  • Ja, genau so hab ich es auch geschrieben, nur habe ich halt das Problem mit der doppelten Referenz 😞

    bool Example::compare(const std::string rhs);
    

    funktioniert einwandfrei, nur

    bool Example::compare(const std::string &rhs);
    

    wird die doppelte Referenz mir angekreidet.



  • Was für eine doppelte Referenz? Zeig mal bitte deinen exakten Code - und die genaue Fehlermeldung.



  • Hier ist ein Beispiel:

    //#include <iostream>
    #include <vector>
    #include <string>
    //#include <algorithm>
    #include <functional>
    
    class Example
    {
    private:
    	std::string name;
    public:
    	explicit Example(const std::string &rhs)
    		: name(rhs)
    	{}
    	bool operator == (const std::string &rhs)
    	{
    		return name == rhs;
    	}
    
    	Example operator()()
    	{
    		return *this;
    	}
    };
    
    int main()
    {
    	std::vector<Example> tmpVec;
    	std::generate_n(std::back_inserter(tmpVec), 10, Example("Hallo"));
    
    	const std::string szCmpExample = "Hallo";
    	std::vector<Example>::iterator myIter = std::find_if(tmpVec.begin(), tmpVec.end(), std::bind2nd(std::mem_fun_ref(&Example::operator ==), szCmpExample));
    	if(myIter != tmpVec.end())
    	{
    		// found ...
    	}
    
    	return 0;
    }
    

    mit der Fehlermeldung:

    $ g++ memfun.cpp
    /usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_function.h: In instantiation of `std::binder2nd<std::mem_fun1_ref_t<bool, Example, const std::string&> >':memfun.cpp:33:   instantiated from here
    /usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_function.h:436: error: forming reference to reference type `const std::string&'
    /usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_function.h: In function `std::binder2nd<_Operation> std::bind2nd(const _Operation&, const _Tp&) [with _Operation = std::mem_fun1_ref_t<bool, Example, const std::string&>, _Tp = std::string]':memfun.cpp:33:   instantiated from here
    /usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_function.h:455: error: no matching function for call to `std::binder2nd<std::mem_fun1_ref_t<bool, Example, const std::string&> >::binder2nd(const std::mem_fun1_ref_t<bool, Example, const std::string&>&, const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
    /usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_function.h:429: note: candidates are: std::binder2nd<std::mem_fun1_ref_t<bool, Example, const std::string&> >::binder2nd(const std::binder2nd<std::mem_fun1_ref_t<bool, Example, const std::string&> >&)
    

    Wichtiges Element der Fehlermeldung erscheint mir

    forming reference to reference type `const std::string&'
    


  • Das ist ein bekannter Defekt mit std::bind_Xnd.

    Mach doch mal den operator== const. IIRC sollte das helfen.



  • 7H3 N4C3R schrieb:

    Das ist ein bekannter Defekt mit std::bind_Xnd.

    Mach doch mal den operator== const. IIRC sollte das helfen.

    Nein, die Fehlermeldung bleibt die Gleiche... ich gehe von aus, dass das Template mem_fun_ref intern schon eine Referenz nimmt für den Parameter der Methode. Somit würde eine Referenz auf eine Referenz angenommen werden, was wohl das Problem ist, da wenn ich den Operator so ändern, dass keine Referenz erwartet wird, funktioniert es.



  • Nein du übersetzt den Satz falsch 😛 mach daraus "referenzieren auf Referenztyp" ...

    bool const& operator==(std::string const& rhs) const
    { return name == rhs; }
    

    sollte eigtl. gehen ...



  • Kommt denn dieselbe Fehlermeldung, wenn du statt find_if(... operator ==), einfach nur find() verwendest? Aber dein Operator == sollte auf jeden Fall eine konstante Memberfunktion sein.
    Und welche gcc-version hast du?



  • Ich verwende g++ 3.4.4 unter Cygwin, wenn ich

    std::find(..., mySearchString);
    

    benutze geht es.

    die Änderung auf

    bool const& operator==(std::string const& rhs) const
    

    hilft leider nicht, zumal dann die find-Variante nicht mehr funktioniert (Referenz auf temporäres Objekt).

    Der oprerator == ist eine konstante Memberfunktion war nur im Testprogramm falsch drin 😞 trotz allem verstehe ich nicht warum das Testprogramm so nicht funktioniert. An Konstkorrektheit sollte es nicht scheitern 😉





  • Danke 🙂 Der boost-Link hat mir geholfen ^^


Anmelden zum Antworten