seltsamer Compiler-Fehler mit bind2nd (): "Member-Funktion bereits definiert oder deklariert" statt "Referenz auf Referenz"

8

Ich habe kürzlich einige Zeit damit verbracht, die Fehlermeldung zu verstehen, als ich func() in diesem Codeabschnitt aufgerufen habe:

%Vor%

Wenn func() wie folgt deklariert wurde, wurde der Code korrekt kompiliert:

%Vor%

Wenn ich diese Deklaration (für Effizienz) verwendet habe, habe ich einen Compilerfehler bekommen:

%Vor%

Der Fehler, den ich erwartet habe, war so etwas wie ein Fehler Verweis auf Referenz wegen der Definition von operator () von binder2nd,

%Vor%

Zu meiner Überraschung war der Fehler, den der Visual C ++ (VS2012) Compiler mir gab,:

  

Fehler C2535: 'void std :: binder2nd & lt; _Fn2 & gt; :: operator () (const   std :: vector & lt; _Ty & gt; & amp;) const ': Mitgliedsfunktion bereits definiert oder   erklärt

was ich nicht entziffern kann.

  • Können Sie erklären, unter welchem ​​Mechanismus der operator() bereits ist? definiert ?

Der volle Fehler, den ich bekam, war:

%Vor%     
Grim Fandango 10.09.2012, 10:20
quelle

2 Antworten

6

Dieses Verhalten ist gut definiert (jeder korrekte C ++ - Compiler kann Ihren Code nicht kompilieren).

Aus dem Standardabschnitt (N3376) D.9.3 in der Klassenvorlage binder2nd existieren diese beiden Definitionen von operator() :

%Vor%

Wenn first_argument_type bereits ein const T& ist, dann sind sie in Konflikt.

    
Travis Gockel 10.09.2012, 11:18
quelle
0

Das ist keine Antwort, aber ich möchte nur die moderne C ++ 11-Lösung aufzeichnen, in der alle kleinen Bind-Helper zugunsten des universellen std::bind veraltet sind:

%Vor%

Die variadischen Vorlagen von C ++ 11 sowie eine umfassendere Sammlung von typenmodifizierenden Merkmalen geben std::bind viel stärkere Abzugsfähigkeiten als die vorherigen Komponenten in <functional> .

    
Kerrek SB 10.09.2012 11:02
quelle