g++ Probleme mit Containern und Iteratoren?!



  • Hallo.

    Ich habe ein Problem mit meinem Compiler (glaube ich).
    Ich bin erst vor einem Monat auf Linux (Ubuntu 8.10) umgestiegen und bin deswegen noch nicht all zu bewandert. Zum Programmieren benutze ich das Programm Geany. Als Compiler wird der GNU Compiler benutzt.

    Es geht um folgenden C++ Code mit Verwendung von Templates und Containern:

    /*-------------------+----------------------------+--------------------+
    | Ohm-Hochschule     |                            | cont1.cpp          |
    | Nuernberg          |    Programmieren in C++    |--------------------|
    | Peter Jesorsky     |                            | 03.07.2007         |
    +--------------------+----------------------------+-------------------*/
    /*
    Einsatz eines vector-, list- oder deque-Containers
    Die Klasse vector kann gegen list oder deque ausgetauscht werden.
    */
    
    #include <iostream>
    #include <vector>
    using namespace std;
    
    template <class T> 
    ostream & operator<<(ostream &os, const vector<T> &co)
    {
       // über alle Elemente iterieren
       // Wenn der Container-Inhalt nicht verändert werden darf, muss statt
       // des iterator- ein const_iterator-Objekt eingesetzt werden.
       vector<T>::const_iterator iter;
       for (iter = co.begin(); iter != co.end(); iter++)
          os << *iter << ' ';
       os << endl;
       return os;
    }
    
    int main(void)
    {
       vector<int> cont;
       vector<int>::iterator it;
    
       // Elemente hinzufügen
       cont.push_back(1);
       cont.push_back(2);
       cont.push_back(4);
       cont.push_back(5);
       cout << "1: " << cont;         // 1 2 4 5
    
       // auf das erste und letzte Element zugreifen
       cout << "2: " << cont.front() << ' ' << cont.back() << endl;
    
       // Element 3 an Pos. 2 einfügen
       it = cont.begin();      // Pos. 0
       it++;                   // Pos. 1
       it++;                   // Pos. 2
       cont.insert(it, 3);
       cout << "3: " << cont;         // 1 2 3 4 5
    
       // letztes Element entfernen
       cont.pop_back(); 
       cout << "4: " << cont;         // 1 2 3 4
    
       // Erstes Element mit dem Wert 3 suchen und entfernen
       for (it = cont.begin(); it != cont.end(); it++)
       {
          if (*it == 3)
          {
             cont.erase(it);
             break;
          }
       }
       cout << "5: " << cont;         // 1 2 4
    
       // Anzahl der Elemente
       cout << "6: " << cont.empty() << endl;
       cout << "7: " << cont.size() << endl;
    
       // Alle Elemente löschen
       cont.clear();
       cout << "8: " << cont.size() << endl;
    
       return 0;
    }
    
    /* Ausgabe:
    ------------------------------------------------------------------------
    1: 1 2 4 5
    2: 1 5
    3: 1 2 3 4 5
    4: 1 2 3 4
    5: 1 2 4
    6: 0
    7: 3
    8: 0
    ----------------------------------------------------------------------*/
    

    Ich will dazu sagen, dass der Code (wie im Kommentar steht) von meinem Professor ist, und ich gehe davon aus, dass er kompilier bar ist. Leider habe ich keine Möglichkeit den Code in einem Windows Compiler zu testen.

    Die Befehle zum compilieren sind bei mir folgendermaßen:

    g++ -Wall -c datei.c
    
    g++ -Wall -o datei datei.c
    

    Muss ich vllt noch einen Parameter hunzufügen, wenn ich Iteratoren benutze, bzw Container?

    Oder an was könnte es dann liegen?

    Wäre über jeden Rat dankbar.

    MfG, exaveal



  • Oder an was könnte es dann liegen?

    Funktioniert was nicht, wo ist das Problem oder was sagt der Compiler?


  • Mod

    Da du keine Fehlermeldung angibst, habe ich das mal durch den GNU-Compiler laufen lassen. Die Ausgabe ist eigentlich ziemlich eindeutig:

    test.cc: In function 'std::ostream& operator<<(std::ostream&, const std::vector<T, std::allocator<_CharT> >&)':
    test.cc:21: error: expected `;' before 'iter'
    test.cc:22: error: 'iter' was not declared in this scope
    test.cc: In function 'std::ostream& operator<<(std::ostream&, const std::vector<T, std::allocator<_CharT> >&) [with T = int]':
    test.cc:38:   instantiated from here
    test.cc:21: error: dependent-name 'std::vector<T,std::allocator<_CharT> >::const_iterator' is parsed as a non-type, but instantiation yields a type
    test.cc:21: note: say 'typename std::vector<T,std::allocator<_CharT> >::const_iterator' if a type is meant
    

    Und genau das ist auch die Lösung, Zeile 21 muss

    typename vector<T>::const_iterator iter;
    

    lauten.

    edit: Und hier noch eine ganz gute Erklärung, warum das so ist:
    http://pages.cs.wisc.edu/~driscoll/typename.html



  • dankedankedankedanke!

    das ging ja schnell wie sonst was 🙂



  • Meine ganz persönliche und unmassgebliche Meineung: wenn schon Container und Iteratoren,

    vector<T>::const_iterator iter;
       for (iter = co.begin(); iter != co.end(); iter++)
          os << *iter << ' ';
    

    dann auch Alorithmen:

    copy(co.begin(), co.end(), ostream_iterator<T>(os, " ");
    

    Siehe auch: http://www.ddj.com/cpp/184401446



  • ex.aveal schrieb:

    das ging ja schnell wie sonst was 🙂

    die Antwort hat dir der Compiler aber schon gesagt:

    test.cc:21: note: say 'typename std::vector<T,std::allocator<_CharT> >::const_iterator' if a type is meant
    


  • jencas schrieb:

    Meine ganz persönliche und unmassgebliche Meineung: wenn schon Container und Iteratoren,

    vector<T>::const_iterator iter;
       for (iter = co.begin(); iter != co.end(); iter++)
          os << *iter << ' ';
    

    dann auch Alorithmen:

    copy(co.begin(), co.end(), ostream_iterator<T>(os, " ");
    

    Siehe auch: http://www.ddj.com/cpp/184401446

    Genau - wieso soll man den Studenten am Anfang Code vorsetzen, den sie auch verstehen? Ich weiß ja nicht, nach wie vielen Monaten C++ du den copy-Weg übersichtlicher fandest, als ne normale Schleife - aber bei mir hat das ein wenig gedauert...
    Jetzt find ich den copy-Weg auch lesbarer und eleganter (nicht zu letzt, weil er kürzer ist) - aber am Anfang würde ich von dessen Verwendung absehen...

    bb


Anmelden zum Antworten