Ich habe kürzlich einige Zeit damit verbracht, die Fehlermeldung zu verstehen, als ich func()
in diesem Codeabschnitt aufgerufen habe:
Wenn func()
wie folgt deklariert wurde, wurde der Code korrekt kompiliert:
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.
operator()
bereits ist?
definiert ? Der volle Fehler, den ich bekam, war:
%Vor%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()
:
Wenn first_argument_type
bereits ein const T&
ist, dann sind sie in Konflikt.
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:
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>
.
Tags und Links c++ templates compiler-errors bind2nd