Compile-Fehler bei std::logical_and, std::greater und std::less_equal
-
Hallo,
beim Compilieren des folgenden Codes:
#include <algorithm> #include <functional> #include <iostream> #include <utility> #include <vector> int main(int argc, char* argv[]) { using namespace std::placeholders; vector<int> ints; ints.push_back(7); ints.push_back(4); ints.push_back(12); ints.push_back(10); int count = count_if(begin(ints), end(ints), bind(logical_and<bool>(), bind(greater<int>(), _1, 5), bind(less_equal<int>(), _1, 10))); cout << count; return 0; }
tritt der folgende Fehler auf:
error C2664: 'bool std::logical_and<_Ty>::operator ()(const _Ty &,const _Ty &) const': Konvertierung des Parameters 1 von 'std::tr1::_Bind_fty<_Fty,_Ret,_BindN>' in 'const bool &' nicht möglich
Ich sehe meinen Fehler nicht.
-
logical_and
nimmtbool
s, aber keine Funktionsobjekte.
-
TyRoXx schrieb:
logical_and
nimmtbool
s, aber keine Funktionsobjekte.sowohl greater als auch less_equal sind Funktionsobjekte, dessen operator() ein bool zurückliefert (laut http://www.cplusplus.com/reference/functional/greater/)
-
Ich sehe gerade im Code fehlt das using namespace std;
Dies ist im Testcode aber drin!
-
Gerade mal mit bind aus der Boost-Library getestet. Dannn funktioniert es.
-
sieht nach einem älteren Compiler aus.
VS 2013 compiliert das ohne Probleme.
-
das tr1 in der Fehlermeldung ist auch verdächtig.
-
uwe00 schrieb:
Gerade mal mit bind aus der Boost-Library getestet. Dannn funktioniert es.
Boost bind kann das, was du machen willst. Das Standard-
bind
kann das nicht.Mit Boost kann man das ganze natürlich noch einfacher schreiben.
using boost::phoenix::arg_names::arg1; auto count = boost::range::count_if(ints, (arg1 > 5) && (arg1 <= 10));
-
__me schrieb:
das tr1 in der Fehlermeldung ist auch verdächtig.
Danke __me. Es ist VS2010. Muss ich leider verwenden. Verwende ich halt boost erst einmal weiter, wollte eigentlich auf std::bind umsteigen.