WinFuture-Forum.de: [gelöst] [c++] Klassenmethode In For_each Aufrufen - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

[gelöst] [c++] Klassenmethode In For_each Aufrufen Templates, Funktoren


#1 Mitglied ist offline   Der Kenner 

  • Gruppe: aktive Mitglieder
  • Beiträge: 574
  • Beigetreten: 30. Januar 05
  • Reputation: 0

geschrieben 19. Mai 2009 - 06:27

Hallo,

ich bin gerade am Basteln und hab da ein kleines Programm, das nicht so recht funktionieren will. Ich seh den Fehler absolut nicht :wink:

#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>

class MyClass {
	public:
		void myFunc(int i) { std::cout<<i<<"\n"; }
};


template<typename C, typename R, typename A>  // C: Klassentyp, R: Ergebnistyp, A: Argumenttyp
struct mem_fun_bind1_t : public std::unary_function<A, R>
{
	C& c; // Referenz auf Aufruferobjekt
	R (C::*pMtr)(A); // Funktionszeiger
	
	explicit mem_fun_bind1_t( C& _c, R [b]([/b]C::*_pMtr[b])[/b](A) ) : c(_c), pMtr(_pMtr) // Konstruktor setzt Aufrufer und aufzurufende Methode (Zeiger)
	{}
	R operator()(A a) // überladen mit Parameter, der von for_each übermittelt wird
	{
		return (c.*pMtr)(a); // eigentlicher Methodenaufruf
	}
};  
				
				
				
template<typename C, typename R, typename A> // C: Klassentyp, R: Ergebnistyp, A: Argumenttyp
mem_fun_bind1_t<C, R, A>
mem_fun_bind1(C& c, R (C::*pMtr)(A))
{
	return mem_fun_bind1_t<C, R, A>(c, pMtr); // Funktor erzeugen
}


int main() {
	MyClass myclass;
	std::vector<int> v;
	for(int i=0; i<10; ++i) v.push_back(i);
	std::for_each(v.begin(), v.end(), mem_fun_bind1(myclass, &MyClass::myFunc)); // gewünschtes Endresultat: a.myFunc(*iterator)
}


Der Fehler dabei lautet:

Zitat

error: no matching function for call to ‘mem_fun_bind1(A&, void (A::*)(int))’


Danke für eure Tipps!

Dieser Beitrag wurde von Witi bearbeitet: 26. Mai 2009 - 07:58

0

Anzeige



#2 Mitglied ist offline   Der Kenner 

  • Gruppe: aktive Mitglieder
  • Beiträge: 574
  • Beigetreten: 30. Januar 05
  • Reputation: 0

geschrieben 22. Mai 2009 - 23:04

Ich hab mir's grade selber noch mal angeschaut. Zwei Sachen sind auszubessern, falls es jemanden interessiert:
1. Selbst, wenn es keinen Fehler gibt, sollte der Klassenname alleine aus Gründen der Übersichtlichkeit nicht gleich mit dem Template-Parameter sein.
2. Der eigentliche Grund für den Fehler waren fehlende Klammern.

Ich hab den Code oben mal dahingegehend ergänzt.

Vielleicht mag ein Mod ein "gelöst"-Tag vor den Threadtitel setzen. Ich denke, das Problem ist nicht allzu exotisch.

Dieser Beitrag wurde von Der Kenner bearbeitet: 22. Mai 2009 - 23:05

0

#3 Mitglied ist offline   Der Kenner 

  • Gruppe: aktive Mitglieder
  • Beiträge: 574
  • Beigetreten: 30. Januar 05
  • Reputation: 0

geschrieben 25. Mai 2009 - 12:14

Ähm, die wirklich praktikable Lösung ist natürlich, das vordefinierte bind zu benutzen:
#include <iostream>
#include <algorithm>
#include <vector>
#include <tr1/functional>

class MyClass {
	public:
		void myFunc(int i) { std::cout<<i<<"\n"; }
};

int main() {
	MyClass myclass;
	std::vector<int> v;
	for(int i=0; i<10; ++i) v.push_back(i);
	std::for_each(v.begin(), v.end(), std::tr1::bind(&MyClass::myFunc, myclass, std::tr1::placeholders::_1));
}



Was dann schon etwas weiter vom ursprünglichen Code weggeht, aber in diesem Sonderfall besonders gut funktioniert, ist den Funktionsaufruf in for_each durch eine (namenlose) Lambda-Funktion zu ersetzen. Bislang noch nicht im Sprachumfang, aber der neue Standard wird's uns bescheren. Solange muss man eben noch auf Boost ausweichen.

#include <iostream>
#include <algorithm>
#include <vector>
#include <boost/lambda/lambda.hpp>

int main() {
std::vector<int> v;
	for(int i=0; i<10; ++i) v.push_back(i);
	std::for_each(v.begin(), v.end(), std::cout<< boost::lambda::_1 <<"\n");
}

Dieser Beitrag wurde von Der Kenner bearbeitet: 25. Mai 2009 - 12:15

0

#4 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 26. Mai 2009 - 07:57

Zitat

Vielleicht mag ein Mod ein "gelöst"-Tag vor den Threadtitel setzen.

Gerne. Für jede Lösungsalternative einen? :(

Ich weiß schon warum ich C++ bisher nie wirklich verstanden (ok, auch nicht wirklich mit beschäftigt) habe...
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0