Ich habe zwei überladene Elementfunktionen mit den folgenden Signaturen:boost :: bind mit überladenen Funktionen?
class MyClass
{
void f(int, int, int);
void f(int, int, int, double);
};
I boost bin mit :: bind wie folgt:
boost::bind(&MyClass::f, _1, 1, 2, 3); // _1 is a placeholder for the implicit parameter
Mein Problem ist eigentlich, dass es kein Problem ist. Laut Boost :: Bind-Dokumentation (um http://www.boost.org/doc/libs/1_49_0/libs/bind/bind.html#err_overloaded) sollte dies "normalerweise" zu einem Fehler führen, und ich sollte auf den Funktionszeigertyp umwandeln müssen. Mein Code wird jedoch ohne Fehler kompiliert und scheint wie erwartet zu funktionieren.
Das Beispiel in der Dokumentation ist einer, wo der einzige Unterschied in den überladenen Funktionen ist, dass der eine const ist, während der andere nicht ist. Meine Vermutung ist daher, dass ich kein Problem habe, weil der Compiler den Unterschied zwischen den beiden überladenen Funktionen erkennen kann, weil die Anzahl (und Typen) von Argumenten unterschiedlich ist, während im Beispiel der Dokumentation kein Weg für die Compiler, um zu sagen, welche Version Sie beabsichtigen, einfach aus den an boost :: bind übergebenen Argumenten. Andererseits bin ich skeptisch gegenüber meiner Vermutung, weil ich in Frage stelle, wie der Compiler weiß, dass die letzten 3 Argumente, die in meinem Beispiel an boost :: bind übergeben werden, mit dem Funktionszeiger im ersten Argument verknüpft sind (und daher Teil seiner Signatur sind)) - es scheint mir, dass dies eine interne Angelegenheit für boost :: bind ist, von der der Compiler keine Kenntnis haben sollte.
Weder die Dokumentation noch andere Ratschläge, die ich beim googlen dieses Problems finden kann, geben an, dass es nur ein Problem mit überladenen Funktionen gibt, die die gleichen Argumenttypen haben. Also wäre ich dankbar, wenn jemand bestätigen könnte, dass meine Vermutung richtig ist (und implizit, warum meine Skepsis falsch ist), bevor ich mich auf meinen Code unter der (möglicherweise falschen) Annahme stütze, dass er gültig ist. Meine Sorge ist, dass der Compiler einfach die zu bindende Funktion basierend auf der Argumentation wählt, die ich z. das erste auswählend, das es rüberkommt.
Mit welchem Compiler können Sie '& MyClass :: f' ohne Disambiguierung ausführen? – ildjarn
MS Visual C++ 2005 – JBentley
Verwenden Sie ein altes Toolset auf _purpose_? ; -] – ildjarn