Frage zu std::bind2nd (Pre C++11)
-
Hi, ich möchte in meinem Programm (in dem ich keinen Zugriff auf C++11 Features habe) Folgendes machen:
#include <utility> #include <functional> #include <vector> #include <algorithm> #include <string> bool pred(const std::pair<double, std::string>& a, const double& b) { return a.first < b; } int main() { std::vector<std::pair<double, std::string> > vec; // suche ein Element < 0.5 std::find_if(vec.begin(), vec.end(), std::bind2nd(pred, 0.5)); }Ich sehe meinen Fehler nicht und aus der Fehlermeldung werde ich auch nicht so richtig schau:
In file included from /usr/include/c++/4.8/bits/stl_function.h:731:0, from /usr/include/c++/4.8/functional:49, from test.cpp:2: /usr/include/c++/4.8/backward/binders.h: In instantiation of ‘class std::binder2nd<bool(const std::pair<double, std::basic_string<char> >&, const double&)>’: test.cpp:15:61: required from here /usr/include/c++/4.8/backward/binders.h:139:11: error: ‘bool(const std::pair<double, std::basic_string<char> >&, const double&)’ is not a class, struct, or union type class binder2nd ^ /usr/include/c++/4.8/backward/binders.h:145:49: error: ‘bool(const std::pair<double, std::basic_string<char> >&, const double&)’ is not a class, struct, or union type typename _Operation::second_argument_type value; ^ /usr/include/c++/4.8/backward/binders.h:148:7: error: ‘bool(const std::pair<double, std::basic_string<char> >&, const double&)’ is not a class, struct, or union type binder2nd(const _Operation& __x, ^ /usr/include/c++/4.8/backward/binders.h:153:7: error: ‘bool(const std::pair<double, std::basic_string<char> >&, const double&)’ is not a class, struct, or union type operator()(const typename _Operation::first_argument_type& __x) const ^ /usr/include/c++/4.8/backward/binders.h:159:7: error: ‘bool(const std::pair<double, std::basic_string<char> >&, const double&)’ is not a class, struct, or union type operator()(typename _Operation::first_argument_type& __x) const ^ /usr/include/c++/4.8/backward/binders.h:144:18: error: field ‘std::binder2nd<bool(const std::pair<double, std::basic_string<char> >&, const double&)>::op’ invalidly declared function type _Operation op; ^ /usr/include/c++/4.8/backward/binders.h: In instantiation of ‘std::binder2nd<_Operation> std::bind2nd(const _Operation&, const _Tp&) [with _Operation = bool(const std::pair<double, std::basic_string<char> >&, const double&); _Tp = double]’: test.cpp:15:61: required from here /usr/include/c++/4.8/backward/binders.h:168:57: error: ‘bool(const std::pair<double, std::basic_string<char> >&, const double&)’ is not a class, struct, or union type typedef typename _Operation::second_argument_type _Arg2_type; ^ In file included from /usr/include/c++/4.8/algorithm:62:0, from test.cpp:4: /usr/include/c++/4.8/bits/stl_algo.h: In instantiation of ‘_RandomAccessIterator std::__find_if(_RandomAccessIterator, _RandomAccessIterator, _Predicate, std::random_access_iterator_tag) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<std::pair<double, std::basic_string<char> >*, std::vector<std::pair<double, std::basic_string<char> > > >; _Predicate = std::binder2nd<bool(const std::pair<double, std::basic_string<char> >&, const double&)>]’: /usr/include/c++/4.8/bits/stl_algo.h:4488:41: required from ‘_IIter std::find_if(_IIter, _IIter, _Predicate) [with _IIter = __gnu_cxx::__normal_iterator<std::pair<double, std::basic_string<char> >*, std::vector<std::pair<double, std::basic_string<char> > > >; _Predicate = std::binder2nd<bool(const std::pair<double, std::basic_string<char> >&, const double&)>]’ test.cpp:15:62: required from here /usr/include/c++/4.8/bits/stl_algo.h:208:23: error: no match for call to ‘(std::binder2nd<bool(const std::pair<double, std::basic_string<char> >&, const double&)>) (std::pair<double, std::basic_string<char> >&)’ if (__pred(*__first)) ^ /usr/include/c++/4.8/bits/stl_algo.h:212:23: error: no match for call to ‘(std::binder2nd<bool(const std::pair<double, std::basic_string<char> >&, const double&)>) (std::pair<double, std::basic_string<char> >&)’ if (__pred(*__first)) ^ /usr/include/c++/4.8/bits/stl_algo.h:216:23: error: no match for call to ‘(std::binder2nd<bool(const std::pair<double, std::basic_string<char> >&, const double&)>) (std::pair<double, std::basic_string<char> >&)’ if (__pred(*__first)) ^ /usr/include/c++/4.8/bits/stl_algo.h:220:23: error: no match for call to ‘(std::binder2nd<bool(const std::pair<double, std::basic_string<char> >&, const double&)>) (std::pair<double, std::basic_string<char> >&)’ if (__pred(*__first)) ^ /usr/include/c++/4.8/bits/stl_algo.h:228:23: error: no match for call to ‘(std::binder2nd<bool(const std::pair<double, std::basic_string<char> >&, const double&)>) (std::pair<double, std::basic_string<char> >&)’ if (__pred(*__first)) ^ /usr/include/c++/4.8/bits/stl_algo.h:232:23: error: no match for call to ‘(std::binder2nd<bool(const std::pair<double, std::basic_string<char> >&, const double&)>) (std::pair<double, std::basic_string<char> >&)’ if (__pred(*__first)) ^ /usr/include/c++/4.8/bits/stl_algo.h:236:23: error: no match for call to ‘(std::binder2nd<bool(const std::pair<double, std::basic_string<char> >&, const double&)>) (std::pair<double, std::basic_string<char> >&)’ if (__pred(*__first))Kann mit jemand einen Tipp geben, wo hier mein Fehler liegt? Benutze ich bind2nd hier falsch?

-
bind2nd(undbinder2nd) funktionieren nur mit Funktoren, die vonstd::binary_functionabgeleitet wurden (bzw. entsprechende Typedefs bereitstellen).Warum benutzt du nicht einfach eine Schleife

-
Ah stimmt, da war ja was! Danke
Warum keine Schleife? Wegen Item 50: Prefer algorithm calls to hand-written loops
-
Benutze boost::bind, wenn C++11 nicht geht.
-
Nimm eine Schleife, wenn es naheliegend ist. Kein Grund, sich das Leben wegen Items in bekannten Büchern schwer zu machen. Ansonsten nimm Funktoren.
Die C++98-Binder sind inzwischen eh deprecated.
-
Wieso hast Du denn keinen Zugriff auf C++11, wenn man fragen darf? Du kompilierst doch mit gcc 4.8.
-
Das Programm habe ich auf meinem Laptop geschrieben. Laufen soll es aber auf einem Cluster-System, das auf einigen Rechnern nur gcc 4.5 zur Verfügung hat (verrückt, ich weiß
)
-
asdfasd schrieb:
Das Programm habe ich auf meinem Laptop geschrieben. Laufen soll es aber auf einem Cluster-System, das auf einigen Rechnern nur gcc 4.5 zur Verfügung hat (verrückt, ich weiß
)...?
Damit ein C++ Programm laufen kann, braucht es überhaupt keinen Compiler...
C++11 Code wird da ohne Probleme laufen, die können es nur nicht kompilieren.
-
Damit ein C++ Programm laufen kann, braucht es überhaupt keinen Compiler...
Kann man denn das Programm auf einem Home-Rechner mit GCC 4.8 kompilieren und dann einfach auf dem Cluster-System ausfuehren?
-
Arcoth schrieb:
Damit ein C++ Programm laufen kann, braucht es überhaupt keinen Compiler...
Kann man denn das Programm auf einem Home-Rechner mit GCC 4.8 kompilieren und dann einfach auf dem Cluster-System ausfuehren?
Wenn sie dieselbe Architektur haben schon. Ansonsten die Architektur des Clusters rausfinden und dem gcc sagen er soll es für die Clusterarchitektur und nicht für den Laptop kompilieren. Vielleicht ist das ja eine so exotische Architektur, dass es dafür gar keinen aktuelleren Compiler gibt.
-
nwp3 schrieb:
Arcoth schrieb:
Damit ein C++ Programm laufen kann, braucht es überhaupt keinen Compiler...
Kann man denn das Programm auf einem Home-Rechner mit GCC 4.8 kompilieren und dann einfach auf dem Cluster-System ausfuehren?
Wenn sie dieselbe Architektur haben schon. Ansonsten die Architektur des Clusters rausfinden und dem gcc sagen er soll es für die Clusterarchitektur und nicht für den Laptop kompilieren. Vielleicht ist das ja eine so exotische Architektur, dass es dafür gar keinen aktuelleren Compiler gibt.
Ganz so einfach ist das in der Praxis nicht. Ich würde jedenfalls lieber auf C++11 verzichten, als eine Cross-Compilierung zu versuchen.
P.S.: Es gibt aber immer noch boost::bind. Das gibt's auch für GCC 4.5 und ist ziemlich nahe am C++11 bind.