Frage zu Funktionsobjekt
-
Hio

ich soll im rahmen einer übugn an der uni mehrere Funktionsobjekte zu bereits vorgefertigtem code schreiben. leider kompiliert das ganze nicht und ich seh keine Fehler8aufbau entspricht dem der Beispielprogramme aus der Vorlesung):
Die klasse zum Funktionsobjekt:
[code="cpp"class rabbat_erhoehen : public binary_function<Kunde& ,float , void>{
public:
void operator()(Kunde& a,float r){
a.set_rabbat(r);
}
};[/code]der aufruf ( war schon vorgefertigt und soll nicht geändert werden)
for_each(kunden.begin(), kunden.end(), bind2nd(rabbat_erhoehen(),1.5));der Fehler von VS2012:
c:\program files (x86)\microsoft visual studio 11.0\vc\include\xfunctional(328): error C2535: 'void std::binder2nd<_Fn2>::operator ()(Kunde &) const': Memberfunktion bereits definiert oder deklariert 1> with 1> [ 1> _Fn2=rabbat_erhoehen 1> ] 1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\xfunctional(322): Siehe Deklaration von 'std::binder2nd<_Fn2>::operator ()' 1> with 1> [ 1> _Fn2=rabbat_erhoehen 1> ] 1> g:\dropbox\programmieren\oop\blatt12\a41\kunden.cpp(107): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::binder2nd<_Fn2>". 1> with 1> [ 1> _Fn2=rabbat_erhoehen 1> ]vermutlich was ganz einfaches und doofes, aber zaunt mir doch mal mitm winkfahl.
-
ups, habs irgendwie zerschossen, hier nochmal mein code:
class rabbat_erhoehen : public binary_function<Kunde& ,float , void>{ public: void operator()(Kunde& a,float r){ a.set_rabbat(r); } };
-
Was sollst du nun machen? Ein zu
for_each(kunden.begin(), kunden.end(), bind2nd(rabbat_erhoehen(),1.5));passendesrabatt_erhoehenschreiben?
-
jo, richtig. dachte das geht daraus hervor, sorry.
-
Und wie sieht dein fehlerhafter Versuch aus, auf den sich deine Fehlermeldung bezieht?
-
steht doch im zweiten beitrag?
habs im ersten versaut und den unangemeldet abgeschickt, kann also auch nich bearbeiten...
-
Daepilin schrieb:
ups, habs irgendwie zerschossen, hier nochmal mein code:
class rabbat_erhoehen : public binary_function<Kunde& ,float , void>{ public: void operator()(Kunde& a,float r){ a.set_rabbat(r); } };Wenn ich mir eine Referenz zu
binder2ndansehe:template <class Fn> class binder2nd : public unary_function<typename Fn::first_argument_type, typename Fn::result_type> { protected: Fn op; typename Fn::second_argument_type value; public: binder2nd(const Fn& x, const typename Fn::second_argument_type& y); typename Fn::result_type operator()(const typename Fn::first_argument_type& x) const; typename Fn::result_type operator()(typename Fn::first_argument_type& x) const; }; template <class Fn, class T> binder2nd<Fn> bind2nd(const Fn& op, const T& x);Ist
argument_typeder Typ ohne Referenz o.ä. und deroperator()ist const qualifiziert.
also:class rabbat_erhoehen : public std::binary_function<Kunde ,float , void>{ public: void operator() (Kunde& a,float r) const { a.set_rabbat(r); } };
-
gibt ebenso fehler...
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\algorithm(24): error C2664: 'void std::binder2nd<_Fn2>::operator ()(Kunde &) const': Konvertierung des Parameters 1 von 'Kunde *' in 'Kunde &' nicht möglich 1> with 1> [ 1> _Fn2=rabbat_erhoehen 1> ] 1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\algorithm(33): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void std::_For_each<Kunde**,_Fn1>(_InIt,_InIt,_Fn1 &)". 1> with 1> [ 1> _Fn1=std::binder2nd<rabbat_erhoehen>, 1> _InIt=Kunde ** 1> ] 1> g:\dropbox\programmieren\oop\blatt12\a41\kunden.cpp(107): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "_Fn1 std::for_each<std::_Vector_iterator<_Myvec>,std::binder2nd<_Fn2>>(_InIt,_InIt,_Fn1)". 1> with 1> [ 1> _Fn1=std::binder2nd<rabbat_erhoehen>, 1> _Myvec=std::_Vector_val<std::_Simple_types<Kunde *>>, 1> _Fn2=rabbat_erhoehen, 1> _InIt=std::_Vector_iterator<std::_Vector_val<std::_Simple_types<Kunde *>>> 1> ] ========== Alles neu ebtw, die wichtigen zeilen aus der kunden klasse noch:
class Kunde { private: float rabbat; public: void set_rabbat(float r) { rabbat = r; }da is auch außer get und set funktionen, sowie nem konstruktor und nem operator<< nichts definiert drinne.
habs auch direkt mit pointern (und dann eben a->set_rabbat(r); ) probiert
-
Daepilin schrieb:
gibt ebenso fehler...
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\algorithm(24): error C2664: 'void std::binder2nd<_Fn2>::operator ()(Kunde &) const': Konvertierung des Parameters 1 von 'Kunde *' in 'Kunde &' nicht möglich 1Mit einem Container von
Kunde*wird das auch nix...
Ist das auch vorgegeben?
-
seh ich grad erst, jo, ist es oO dann muss ich da nochmal drüberschaun, hab ich garnet gesehn *sry*, jetzt gehts, doof, dass ich das nich selbst bemerkt habe -.-
aber gut, ich hätte das const trotzdem vergessen/übersehn, whatever....
e: geht btw... bzw kompiliert zumindest...
kann den thread wer löschen, is ja fast peinlich

-
Daepilin schrieb:
kann den thread wer löschen, is ja fast peinlich

Die anderen Fehler mit dem fehlenden const und der Referenz sind aber durchaus Fehler auf hohem Niveau, die auch andere Leute interessieren könnten. Ich wette, viele hier im Forum müssten mit dem vorgegebenen Code auch erst einmal eine ganze Weile basteln, bis sie diese Fehler finden und korrigieren können.