Ich habe eine Map, die eine einfache Struktur mit einem Schlüssel speichert. Die Struktur hat zwei Mitgliedsfunktionen, die eine ist const die andere nicht. Ich habe geschafft, die const-Funktion mit std :: for_each ohne Probleme aufzurufen, aber ich habe einige Probleme beim Aufruf der nicht-const-Funktion.
%Vor%Der Aufruf der Funktion const member funktioniert gut, aber Booster intern erwartet irgendwo einen const MyStruct und scheitert daher mit folgendem Kompilierungsfehler in MSVC7.1.
boost \ bind \ mem_fn_template.hpp (151): Fehler C2440: 'argument': Konvertierung von 'const MyStruct * __ w64' nach 'MyStruct * const'
nicht möglich
Ich würde mich über jede Hilfe bei der korrekten Einstellung der Template-Parameter freuen, damit bind die Parameter korrekt erkennt und ich die non const-Funktion aufrufen kann.
danke, Carl
IIRC, Boost.Bind verwendet boost::mem_fn
für die Bindung an Members. Wenn Sie sich nun mem_fun ansehen (scrollen Sie nach unten zum // data member support
-Teil) ), sehen Sie, dass es typedefs seinen Ergebnistyp als const & amp; festlegt, während es immer noch Überladungen des Funktionsaufrufoperators gibt, der die Extraktion eines nichtkonstanten Mitglieds aus einem nichtkonstanten Argument unterstützt.
Es scheint also, dass das Problem darin besteht, dass dies den Rückgabetyp-Abzugsmechanismus von Boost.Bind verwechselt. Eine Lösung wäre also, Bind explizit mitzuteilen, dass das Ergebnis nicht const ist:
%Vor%Wenn Sie das häufig tun müssen, empfehle ich Ihnen, die Boost.RangeEx-Bibliothek zu verwenden:
%Vor%Es wurde in Boost akzeptiert, aber es kommt noch nicht mit der offiziellen Distribution. Bis dahin können Sie herunterladen von der Boost Vault (Download-Link in Zip-Datei).
Wenn Sie bereits auf Boost
angewiesen sind, sind Sie möglicherweise bereit, Boost zu überprüfen Foreach
Sehr viel lesbar, obwohl ich über Leistungsprobleme nicht weiß.
Beachten Sie auch, dass Sie Vorlagen nicht innerhalb des Makros verwenden können, ohne das Zeichen ,
zu "entkommen":
Ein Problem, das ich entdeckt habe: Die zweite Bindung wird für ein Member ohne Funktion aufgerufen. Zweitens ist ein Datenelement, keine Methode von std :: pair