for_each Problem
-
Hoi.
Ich habe ein kleines Problem.
Ich versuche for_each mit meinem custom Inputiterator zu benutzen. Leider gibt es nur einen Durchgang:for_each(Process::iterator(0), Process::iterator(), [&](PROCESSENTRY32W proc) { ....... });
Löse ich es über eine normale for-Schleife, dann klappt es korrekt:
for(Process::iterator it(0); it != Process::iterator(); ++it) { ....... }
Was mich etwas verwirrt, schließlich ist std::for_each mit der selben Logik geschrieben:
template<class _InIt, class _Fn1> inline _Fn1 _For_each(_InIt _First, _InIt _Last, _Fn1 _Func) { // perform function for each element for (; _First != _Last; ++_First) _Func(*_First); return (_Func); }
Kann mir jemand auf die Sprünge helfden?
Danke!
-
Komische Parameter hast du da...
-
Dasgehtwohlwas schrieb:
for_each(Process::iterator(0), Process::iterator(), [&](PROCESSENTRY32W proc) { ....... });
edit: Vergiss, was hier stand.
edit: Ach, das ist ein Lambdaausdruck. Dann sieht es eigentlich richtig aus. Zeig mal ein compilierbares Beispiel.
-
Komische Parameter hast du da...
Naja, ich musste ein bischen hacken da der Iterator über Datenmengen mit unbekannter Größe iteriert. Von daher erzeugt der Default-Constructor einen ungültigen iterator und beim Vergleichen wird jediglich die Gültigkeit verglichen um zu wissen ob der echte Iterator noch gültig ist.
Zeig mal ein compilierbares Beispiel.
Mit einem Vektor zb klappt es ja, das irritiert mich
Deswegen ist der Haken wohl bei meinem Iterator zu suchen.Ich komme nicht darauf, warum es mit einer normalen for-Schleife klappt aber mit for_each nicht, obwohl es doch eigentlich identisch funktioniert
-
Ich habe etwas rumprobiert.
Zu allererst der komplette Sourcecode (Bin gerade dabei Kommentierten Beispielscode für meine Library zu schreiben :> ):
//C++ header files: #include <algorithm> #include <iostream> //Synthetic header files: #include <Synthetic.hpp> using namespace std; using namespace Synthetic; int main(int, char**) { //Almost all Synthetic functions throw exceptions in case of error try { // Start iterating processes. // A iterator constructed with an id of zero means that we don't want to // target a specific process. // The second iterator constructed with the default constructor is invalid, // what we want to be able to use std::for_each // We use C++0x lamba-feature instead of creating a custom functor Process::iterator first(0), last(); for_each(first, last, [&](PROCESSENTRY32W proc) { //I imitate the original examples output wcout << L"\n\n====================================================="; wcout << L"\nPROCESS NAME: " << proc.szExeFile; wcout << L"\n-----------------------------------------------------"; //Print information about the process wcout << L"\n Process ID = 0x" << hex << proc.th32ProcessID; wcout << L"\n Thread count = " << dec << proc.cntThreads; wcout << L"\n Parent process ID = 0x" << hex << proc.th32ParentProcessID; wcout << L"\n Priority base = " << dec << proc.pcPriClassBase; }); } catch(const exception& e) //Synthetic's exceptions inherit from std::exception { //Output a formatted error message cout << e.what(); } return 0; }
Das gibt beim Kompilieren folgenden Fehler:
1>x\main.cpp(36): error C2782: '_Fn1 std::for_each(_InIt,_InIt,_Fn1)' : template parameter '_InIt' is ambiguous
1> x\include\algorithm(28) : see declaration of 'std::for_each'
1> could be 'Synthetic::Process::iterator (__cdecl *)(void)'
1> or 'Synthetic::Process::iterator'
1>x\main.cpp(36): error C2784: '_Fn1 std::for_each(_InIt,_InIt,_Fn1)' : could not deduce template argument for '_InIt' from 'Synthetic::Process::iterator'
1> x\include\algorithm(28) : see declaration of 'std::for_each'
1>Sind das für den Compiler echt 2 unterschiedliche Typen, nur weil sie mit unterschiedlichen Constructor konstruiert werden?
oO
Grüße,
Flo
-
Process::iterator first(0), last();
first
ist ein Objekt,last
ist eine Funktionsdeklaration. Lass die Klammern beilast
weg, dann ist es auch ein Objekt.Zum Unterschied zwischen deiner
for
-Schleife undfor_each
:
Was mir spontan auffällt, bei deiner Schleife rufst du regelmässigProcess::iterator()
auf. Bei derfor_each
Funktion dagegen, wird sie nur einmal aufgerufen und der Iterator, bzw. alle Iteratoren, werden kopiert.Setz mal deine Suche an diesen Punkten an.
Grüssli