Dies ist eine viel vereinfachte Repro, die zeigt, wie class Predicate
delcared außerhalb main()
funktioniert, aber wenn der genaue Code inline als class InlinePredicate
erscheint, kann der Compiler std::sort
nicht zuordnen. Das Seltsame ist, dass Sie irgendwas als drittes Argument an std::sort
übergeben können (sagen wir an Integer 7) und Sie erhalten nur einen Kompilierungsfehler, wenn das operator ()
that% nicht unterstützt. co_de% erwartet. Aber wenn ich sort
unterlasse, passt es überhaupt nicht:
repro.cc: In der Funktion 'int main ()':
repro.cc:30: error: Keine passende Funktion für den Aufruf von 'sort (__ gnu_cxx :: __ normaler_iterator, std :: allocator & gt ;, int & gt; *, std :: vektor, std :: allocator & gt ;, int & gt; , std :: allocator, std :: allocator & gt ;, int & gt; & gt; & gt; & gt ;, __gnu_cxx :: __ normal_iterator, std :: allokator & gt ;, int & gt; *, std :: vektor, std :: allokator & gt ;, int & gt ;, std :: allocator, std :: Zuordner & gt ;, int & gt; & gt; & gt; & gt ;; main () :: InlinePredicate & amp;)
In Versionen von C ++ vor C ++ 0x können in Funktionen deklarierte Klassen nicht in Vorlagenparametern angezeigt werden. Dein Aufruf von sort
instanziiert ihn implizit mit einem Template-Parameter, der auf InlinePredicate
gesetzt ist, was illegal ist.
Sie sollten in Erwägung ziehen, entweder C ++ 0x (mit GCC, pass --std=c++0x
; in C ++ 0x wird dieser Code so wie er ist, oder Sie können stattdessen anonyme Funktionen verwenden) oder boost::lambda
. Mit boost::lambda
würde es so aussehen: