Ich versuche, eine Funktion zu schreiben, die einen Funktor als Argument verwendet, den Funktor aufruft und dann seinen zurückgegebenen Wert in einem boost::shared_ptr
zurückgibt.
Das folgende weigert sich zu kompilieren und ich habe keine Ideen mehr. Ich bekomme "std :: vector & lt; std :: string & gt; stellt keinen Aufrufoperator zur Verfügung" (grob). Ich verwende Clang 3.1 unter Mac OS X.
%Vor%Dies ist der Kontext, in dem ich versuche, es zu verwenden:
%Vor%EDIT: Hier ist ein kompletter in sich geschlossener Testfall. Dieser Code kann nicht mit dem gleichen Fehler kompiliert werden, und für das Leben von mir kann ich nicht sehen, was falsch ist:
%Vor%Und hier ist die Fehlerausgabe:
%Vor%Hier sind einige weitere Hinweise. Der folgende Code kompiliert gut, aber das hilft mir nicht, da dies nicht der Code ist, den ich möchte:)
%Vor% Einige Konstruktionen (zB bind
) geben intermediäre "Ausdruck" -Typen zurück, die Sie eigentlich nicht auf der Nase erfassen wollen. In diesem Fall müssen Sie den Typ nicht über auto
erfassen, und Sie müssen möglicherweise explizite Konvertierungen angeben, da andernfalls keine eindeutige benutzerdefinierte Konvertierungskette existiert. Fügen Sie in Ihrem Fall die explizite Konvertierung aus dem Bind-Ausdruck zu function
:
(Dies funktioniert zwar nicht für mich, aber es funktioniert, wenn Sie die entsprechenden std
-Konstruktionen verwenden.)
boost :: protect ist der richtige Weg:
%Vor%Dies ist so sauber wie es nur geht.
Vollständiges Neuschreiben, ursprüngliche Antwort war falsch.
Da ich zunächst nicht wusste, was hier schief lief, habe ich eine Analyse gemacht. Ich behalte es für zukünftige Referenz; Sehen Sie sich die folgende Lösung an, um das Problem zu vermeiden.
bind.hpp
macht das:
was meiner Meinung nach so übersetzt:
%Vor% Sie erwarten also, dass dieser Code das Argument an die Funktion weitergibt, so wie es ist. Damit dies jedoch funktioniert, müsste der Ausdruck a[base_type::a1_]
vom Typ boots:_bi::value<T>
sein, während er vom Typ "uncovered" boost::_bi::bind_t
ist. Anstelle des Funktors, der als Argument übergeben wird, wird eine spezielle überladene Version aufgerufen:
Dies wird die nullary-Funktion evaluieren , anstatt sie weiterzuleiten. Anstelle eines Objekts, das einen Vektor zurückgibt, ist das Argument nun ein Vektor. Nachfolgende Schritte versuchen, das in ein boost::function
umzuwandeln und zu scheitern.
Nochmals bearbeitet:
Es sieht so aus, als ob dieser spezielle Umgang mit verschachtelten Bindungen als Feature gedacht ist . Als ich am #boost
mit den Benutzern Zao und heller gesprochen habe, weiß ich jetzt, dass es eine Funktion protect
gibt, die diesen Effekten entgegenwirkt. Die kanonische Lösung für dieses Problem scheint also die folgende zu sein:
Tags und Links c++ boost templates boost-function