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 nimmt bool s, aber keine Funktionsobjekte.



  • TyRoXx schrieb:

    logical_and nimmt bool 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.


Log in to reply