"Klassenname bietet keinen Aufrufoperator" Fehler beim Versuch, Funktionsrückgabewert zu umbrechen

8

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%     
Lucas 15.07.2012, 19:06
quelle

3 Antworten

2

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 :

hinzu %Vor%

(Dies funktioniert zwar nicht für mich, aber es funktioniert, wenn Sie die entsprechenden std -Konstruktionen verwenden.)

    
Kerrek SB 15.07.2012, 22:53
quelle
3

boost :: protect ist der richtige Weg:

%Vor%

Dies ist so sauber wie es nur geht.

    
Thomas Heller 16.07.2012 08:53
quelle
2

Vollständiges Neuschreiben, ursprüngliche Antwort war falsch.

Fehleranalyse

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:

%Vor%

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:

%Vor%

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.

Kanonische Lösung

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:

%Vor%     
MvG 15.07.2012 20:42
quelle