Prädikate mit for_each



  • hallo,
    folgender code bereitet mir schwierigkeiten

    #include <iostream>
    #include <fstream>
    #include <algorithm>
    #include <string>
    #include <vector>
    
    void mach(const std::string &str)
    {
    	std::cout << "bla" << str << std::endl;
    }
    
    int main()
    {
    	std::ifstream in("C:\\foo.txt");
    	std::istream_iterator<std::string> ii(in);
    	std::istream_iterator<std::string> eos;
    
    	std::vector<std::string> b(ii, eos);
    
    	for_each(b.begin(), b.end(), mach);
    
    	return 0;
    }
    
    --------------------Konfiguration: file - Win32 Debug--------------------
    Kompilierung läuft...
    main.cpp
    C:\Dokumente und Einstellungen\Administrator\Desktop\energis referer\file\main.cpp(18) : error C2664: '__thiscall std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::bas
    ic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >::std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_tra
    its<char>,class std::allocator<char> > > >(unsigned int,const class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &,const class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::
    allocator<char> > > &)' : Konvertierung des Parameters 1 von 'class std::istream_iterator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,char,struct std::char_traits<char> >' in 'unsigned int' nicht moeglich
            Kein benutzerdefinierter Konvertierungsoperator verfuegbar, der diese Konvertierung durchfuehren kann, oder der Operator kann nicht aufgerufen werden
    C:\Dokumente und Einstellungen\Administrator\Desktop\energis referer\file\main.cpp(20) : error C2065: 'for_each' : nichtdeklarierter Bezeichner
    Fehler beim Ausführen von cl.exe.
    
    file.exe - 2 Fehler, 0 Warnung(en)
    

    for_each ist in algorithm definiert und wie man unschwer erkennen kann, habe ich algorithm hinzugefügt.

    danke für eure hilfe



  • Morgen,

    using namespace std;
    //oder
    using std::for_each;
    //oder
    std::for_each(...);
    

    mfg
    v R



  • ok, for_each kann jetzt genau referenziert werden durch std::
    war ein flüchtigkeitsfehler von mir 🙂

    nun bleibt noch ein fehler offen. und zwar tritt ein fehler bei folgender zeile
    auf

    std::vector<std::string> b(ii, eos);
    
    --------------------Konfiguration: file - Win32 Debug--------------------
    Kompilierung läuft...
    main.cpp
    C:\Dokumente und Einstellungen\Administrator\Desktop\energis referer\file\main.cpp(18) : error C2664: '__thiscall std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::bas
    ic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >::std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_tra
    its<char>,class std::allocator<char> > > >(unsigned int,const class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &,const class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::
    allocator<char> > > &)' : Konvertierung des Parameters 1 von 'class std::istream_iterator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,char,struct std::char_traits<char> >' in 'unsigned int' nicht moeglich
            Kein benutzerdefinierter Konvertierungsoperator verfuegbar, der diese Konvertierung durchfuehren kann, oder der Operator kann nicht aufgerufen werden
    Fehler beim Ausführen von cl.exe.
    
    file.exe - 1 Fehler, 0 Warnung(en)
    

    danke! 🙂



  • weiß nicht was dein Compiler meint. Des Spaßes halber hab ich den Code copy/paste und bei mir compilieren und laufen gelassen. Es läuft genauso wie es sollte.

    Nik0n



  • Läuft bei mir auch problemlos, aber erst, als ich den Header <iterator> eingefügt habe. Welchen Compiler benutzt du? Ich benutze gcc 3.4.2



  • ich benutze msv 6



  • hmm, vielleicht gehts, wenn du mach() in eine Klasse umschreibst, die von unary_function<string,void> erbt und an for_each übergibst.



  • gast__ schrieb:

    ich benutze msv 6

    hast du dann den STL Fix installiert ?
    Wenn nicht, such im Forum mal danach...

    Devil



  • Hallo,
    die beim VC 6.0 mitgelieferte Dinkumware-STL verwendet keine Membertemplates (da sie auch schon bei noch älteren VC-Versionen dabei war, die ganz ohne Membertemplate-Support daher kamen). D.h. der vector-Konstruktor der zwei beliebige Iteratoren erwartet existiert hier nicht. Stattdessen kann dieser Ctor nur mit std::vector-Iteratoren umgehen. Lösung: Statt des Ctors musst du einen Algo wie std::copy + einen back_inserter verwenden:

    std::istream_iterator<std::string> ii(in); 
    std::istream_iterator<std::string> eos; 
    
    std::vector<std::string> b;
    std::copy(ii, eos, back_inserter(b));
    

Anmelden zum Antworten