<unresolved overloaded function type>



  • Hi,

    ich hab ein bisschen Schwierigkeiten mit remove_if. Ich möchte remove_if auf einem eigenen Container benutzen:

    template<class monomialOrdering>
    static bool isConstantPol( const MultivariatePolynomial<monomialOrdering> &P)
    {
       return P.isConstant();
    }
    
    template<class monomialOrdering>
    static const MultivariatePolynomialSet <monomialOrdering> elimination(...) {
       MultivariatePolynomialSet<monomialOrdering> ret;
       ...
       remove_if(ret.begin(), ret.end(), isConstantPol);
    }
    

    Leider bekomme ich

    MultivariatePolynomialFactory.h:813:9: error: no matching function for call to ‘remove_if(GiNaC::MultivariatePolynomialSet<GiNaC::ex_is_less_deggrlex>::const_iterator, GiNaC::MultivariatePolynomialSet<GiNaC::ex_is_less_deggrlex>::const_iterator, <unresolved overloaded function type>)’
    

    Der Iterator von MultiPolSet ist implementiert und funktioniert auch soweit bei anderen Sachen gut.

    Hat jemand ne Idee?

    Schöne Grüße

    Joachim



  • Oben steht natürlich noch

    #include <algorithm>
    

    drüber.



  • Das kommt gerne, wenn man eine schließende Klammer vergisst. Schau mal danach. 😉


  • Mod

    Du musst dem remove_if schon noch sagen, welches isConstantPol du meinst. Ein Template reicht da nicht.



  • SeppJ schrieb:

    Du musst dem remove_if schon noch sagen, welches isConstantPol du meinst. Ein Template reicht da nicht.

    So nicht oder ?

    remove_if(ret.begin(), ret.end(), isConstantPol<monomialOrdering>);
    

    Ich steh gerade echt aufm Schlauch.



  • Fast, du brauchst natürlich auch noch ein Objekt davon.
    remove_if(ret.begin(), ret.end(), isConstantPol<monomialOrdering>());



  • unresolved schrieb:

    So nicht oder ?

    remove_if(ret.begin(), ret.end(), isConstantPol<monomialOrdering>);
    

    Tipp: Selbst ausprobieren.


  • Mod

    314159265358979 schrieb:

    Fast, du brauchst natürlich auch noch ein Objekt davon.
    remove_if(ret.begin(), ret.end(), isConstantPol<monomialOrdering>());

    Das ist hier aber eine Funktion, kein Funktor. Das war schon richtig.

    Tipp: Selbst ausprobieren.

    +1. 👍



  • Was ist denn MultivariatePolynomialSet überhaupt? Wenn es vergleichbar mit std::set ist, dann wird std::remove_if auch nicht funktionieren.

    Und selbst, wenn es ein veränderbarer Sequenzcontainer ist, fehlt hier immer noch ein erase, also:
    dercontainer.erase(ergebnis_von_remove_if,dercontainer.end());



  • remove_if(ret.begin(), ret.end(), isConstantPol<monomialOrdering>);
    

    Funktioniert nicht. Mit und ohne Klammern. Ich hatte es ohne Klammern auch schon ausprobiert (das hätte ich vllt nicht als Frage formulieren sollen 🙄 )

    krümelkacker schrieb:

    Was ist denn MultivariatePolynomialSet überhaupt? Wenn es vergleichbar mit std::set ist, dann wird std::remove_if auch nicht funktionieren.

    Es hat ein set.

    set<MultivariatePolynomial<monomialOrdering>, ex_is_less> mElements;
    

    Die iterator werden "weitergeleitet" von dem STL-set. Welche andere Möglichkeit gibt es, denn Element aus einem set zu filtern? Ich bin auf keinen Fall auf remove_if beschränkt. Eine Selbstprogrammier-Lösung mit Schleife fänd ich auch total gut, aber bisher habich da immer Probleme mit kaputten Iteratoren gehabt.


  • Mod

    Und wieder eine Frage, die man sofort in 5 Zeilen hatte beantworten können, wenn der Threadersteller bloß nach dem gefragt hätte, wohin er möchte und nicht danach wie er denkt, dass er dahin kommt:

    for(dein_set_typ::iterator iter = dein_set.begin(); iter != dein_set.end(); )
     if (Bedingung())
      dein_set.erase(iter++);
     else 
      ++iter;
    


  • unresolved schrieb:

    remove_if(ret.begin(), ret.end(), isConstantPol<monomialOrdering>);
    

    Funktioniert nicht.

    "Funktioniert nicht" ist keine vernünftige Fehlerbeschreibung. Aber wir wissen ja jetzt, dass es sich hier um set-Iteratoren handelt. Und da sich die einzelnen set-Elemente unveränderbar sind und std::remove_if zuweisen möchte, geht's natürlich nicht.

    unresolved schrieb:

    Es hat ein set.
    ...
    Die iterator werden "weitergeleitet" von dem STL-set. Welche andere Möglichkeit gibt es, denn Element aus einem set zu filtern?

    set<>::erase

    unresolved schrieb:

    ...aber bisher habich da immer Probleme mit kaputten Iteratoren gehabt.

    Schau in deiner Blbliotheksreferenz nach, bei welchen Aktionen set<>-Iteratoren ungültig werden. So etwas ist dokumentiert.



  • unresolved schrieb:

    Ich bin auf keinen Fall auf remove_if beschränkt. Eine Selbstprogrammier-Lösung mit Schleife fänd ich auch total gut, aber bisher habich da immer Probleme mit kaputten Iteratoren gehabt.

    Dann stell doch einfach die eigentliche Frage, nämlich wie du sowas richtig implementierst, statt nach der Lösung eines Teilproblems eines Weges zu fragen, der für dein Problem sowieso nicht geeignet ist.

    Das mit den kaputten Iteratoren lag vermutlich daran, dass du mit einem Iterator durch das set gewandert bist und dann direkt über den iterator erase aufgerufen hast, wenn du einen Treffer hattest. Das erase invalidiert aber den iterator und du kannst ihn nicht mehr inkrementieren. Die Lösung ist, den Iterator zu kopieren, zu inkrementieren und dann auf der Iterator-Kopie erase aufzurufen. Damit ist nur die Kopie invalidiert und der eigentliche Iterator ist weiterhin gültig.

    Ich hab jetzt extra keine Komplettlösung geliefert - versuchs mal 🙂


  • Mod

    pumuckl schrieb:

    Ich hab jetzt extra keine Komplettlösung geliefert - versuchs mal 🙂

    😃 Ich schätze ja solche Erziehungsmaßnahmen, aber meine Lösung jetzt wieder raus zu editieren wäre wohl auch witzlos.


Log in to reply