2016-04-11 9 views
2

Wie kann ich std::map in Phoenix Lambda-Funktion verwenden?Wie benutzt man std :: map mit boost :: phoenix?

#include <boost\phoenix.hpp> 
#include <map> 

int main() { 
    using namespace boost::phoenix; 
    using namespace boost::phoenix::arg_names; 
    using namespace std; 
    map<int, int> m; 
    auto foo = at(m, 3); 
    foo(); 
} 

Warum funktioniert es nicht? bekomme ich folgende Fehlermeldung:

C2440 'return': cannot convert from 'int' to 'std::pair<const _Kty,_Ty> ' xxx c:\lib\boost\phoenix\stl\container\container.hpp 167 

ich derzeit Visual Studio 2015 Gemeinschaft mit bin und 1,60 Bibliothek steigern.

+0

Bitte lesen Sie diesen Link und senden Sie ein akzeptables Codebeispiel: http://StackOverflow.com/Help/Mcve – xaxxon

+0

Jetzt sieht es gut aus? – ly000

+0

Es verwendet wahrscheinlich 'std :: map :: value_type', um den Ergebnistyp zu bestimmen, der ein' std :: pair 'ist, während' std :: map :: at' nur a zurückgibt Verweis auf den zugeordneten Typ, dh 'int &' oder 'int const &'. –

Antwort

1

Basierend auf der question wies von jv_ aus:

Anstatt die at Funktion, operator[] verwenden.

#include <boost/phoenix.hpp> 
#include <map> 

int main() { 
    std::map<int, int> m; 
    m[3] = 33; 
    auto foo = boost::phoenix::ref(m)[3]; 
    std::cout << foo() << "\n"; 
} 

Es scheint, dass die Umsetzung der Phoenix at lazy Funktion verwendet value_type[1][2] den Ergebnistyp zu bestimmen, der ein std::pair<const int,int> in diesem Fall ist. std::map<int,int>::at gibt jedoch nur reference oder const_reference zurück.

+1

es lohnt sich, darauf hinzuweisen, dass es die Einschränkung hat, dass es mit 'cref (m)' nicht funktioniert, weil 'operator []' eine nicht-konstante Operation ist – sehe

+0

@sehe Guter Punkt. Franky Ich verstehe nicht, warum sie es auf diese Weise implementiert haben, wenn irgendein "Container" "Referenz" und "Const-Reference" haben muss. Aber ich könnte etwas verpassen ... –

Verwandte Themen