Warum schlägt das Prädikat std :: sort fehl, wenn sich die Klasse in main () befindet?

8

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:

%Vor%
  

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;)

    
Ben Jackson 29.07.2011, 23:40
quelle

2 Antworten

9

In C ++ 03 haben lokale Klassen keine Verknüpfung und können daher nicht als Vorlagenargumente verwendet werden (§14.3.1 / 2).

In C ++ 0x wurde diese Einschränkung entfernt und Ihr Code würde so wie er ist kompiliert.

    
ildjarn 29.07.2011, 23:42
quelle
5

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:

%Vor%     
bdonlan 29.07.2011 23:42
quelle

Tags und Links