Frage zu Funktoren (eilig)



  • Hi!

    Hab mir das Beispiel http://www.c-plusplus.net/forum/viewtopic.php?t=70473&highlight=funktor angesehen

    und es ausprobiert .. geht aber nicht! Ich bekomm die Compilerfehlermeldung:
    "set' : 'vergleichsFunktion' is invalid as template argument '#2', type expected"

    mein code

    bool vergleichsFunktion(const string& a, const string& b) 
    { 
        return a < b; 
    } 
    
    ...
    
    main()
    {
    	set<string,vergleichsFunktion>::iterator dictiter;
    	set<string,vergleichsFunktion> dict;
    
    }
    

    wieso das? die Parameter sind vom richtigen Typ .. warum motzt der?

    danke!



  • vergleichsFunktion ist eine Funktion, kein Typ. Versuchs mal mit

    class vergleichsFunktor {
    public:
      bool operator()(string const &a, string const &b) { return a < b; }
    };
    


  • Versuche mal

    struct VergleichsFunktor
    {
    	bool operator()(const string& a, const string& b) 
    	{ 
    		return a < b; 
    	}
    };
    

    template<class _Key, class _Compare, class _Alloc> class std::set;

    Siehe: http://www.sgi.com/tech/stl/set.html



  • 1. std::set benutzt automatisch std::less und damit den operator< von std::string. Es ist also nicht notwendig in diesem Fall einen eigenen Funktor anzugeben.

    2. Als template Parameter musst du einen Type angeben und keine Funktion. Deshalb muss eine solche Funktion gewrappt werden:

    class VergleichsFunktor : public binary_function<string const &, string const &, bool>
    {
    public:
       bool operator()(const string& a, const string& b)
       {
          return a < b;
       }
    }
    


  • hm, also ist die Funktion die da in dem anderen Thread vorgeschlagen wird, falsch? 😕



  • blackwinged schrieb:

    hm, also ist die Funktion die da in dem anderen Thread vorgeschlagen wird, falsch? 😕

    Nö. Du musst nur richtig lesen. In dem zitierten Thread schrieb ich im letzten Beitrag:

    Nein. Der dritte Parameter muss ein *Typ* sein. Also so:

    map<Foo, t_serverdata, bool(*)(const Foo&, const Foo&)> m2(vergleichsFunktion);
    

    Wie du siehst kannst du auch eine Funktion verwenden. Das erfordert zwei Dinge:
    * du musst den *Typ* der Funktion bei der Spezialisierung des Containers angeben
    * du musst die konkrete Funktion (also den Wert für den Typ) an den Konstruktor des Containers übergeben.



  • HumeSikkins schrieb:

    blackwinged schrieb:

    hm, also ist die Funktion die da in dem anderen Thread vorgeschlagen wird, falsch? 😕

    Nö. Du musst nur richtig lesen. In dem zitierten Thread schrieb ich im letzten Beitrag:

    Nein. Der dritte Parameter muss ein *Typ* sein. Also so:

    map<Foo, t_serverdata, bool(*)(const Foo&, const Foo&)> m2(vergleichsFunktion);
    

    Wie du siehst kannst du auch eine Funktion verwenden. Das erfordert zwei Dinge:
    * du musst den *Typ* der Funktion bei der Spezialisierung des Containers angeben
    * du musst die konkrete Funktion (also den Wert für den Typ) an den Konstruktor des Containers übergeben.

    jo stimmt! danke!! 🤡


Anmelden zum Antworten