Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
19.04.2007, 14:49
hausi



Wir mussten heute im C++-Programmieren ein Programm schreiben, welches eine Liste von Wörtern einliest und alle vorkommenden Wörter einmal ausgibt. Einfache Aufgabe mit trivialer Lösung (dachte ich zumindest):
Quellcode:#include <iostream>
#include <iterator>
#include <set>
#include <string>

using namespace std;

int main() {
    typedef istream_iterator<string> isit;
    set<string> s2(isit(cin), isit()); // hier
    copy(s2.begin(), s2.end(), ostream_iterator<string>(cout, "\n"));
}
Das müsste meiner Meinung nach gehen und genau das machen. Jetzt gibts da aber ein Problem: gcc gibt beim kompilieren die folgdende Fehlermeldung:
Quellcode:g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o"main.o" "../main.cpp"
../main.cpp: In function 'int main()':
../main.cpp:15: error: request for member 'begin' in 's2', which is of non-class type 'std::set<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > ()(main()::isit, main()::isit (*)())'
../main.cpp:15: error: request for member 'end' in 's2', which is of non-class type 'std::set<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > ()(main()::isit, main()::isit (*)())'
Lange Rede, kurzer Sinn: GCC nimmt wahrscheinlich an, dass die oben markierte Zeile ein Prototyp einer Funktion sei. Ich habe dazu jetzt mal zwei Lösungen, wobei ich eigentlich keine der beiden wirklich verwenden will:
Quellcode:int main() {
    typedef istream_iterator<string> isit;
    set<string> s;
    copy(isit(cin), isit(), inserter(s, s.begin()));
    copy(s.begin(), s.end(), ostream_iterator<string>(cout, "\n"));

    isit eof;
    set<string> s2(isit(cin), eof);
    copy(s2.begin(), s2.end(), ostream_iterator<string>(cout, "\n"));
}
Jetzt die Frage: Gibt es eine Möglichkeit, um den Compiler beim 1. Versuch dazu zu zwingen, das als Konstruktor aufzufassen (ohne Dinge wie *& vor dem 1. Parameter etc.)? Weiss einer, was der ISO-C++ Standard dazu genau sagt? Ev. ein Bug im GCC (4.1.1)?

Meiner Meinung nach ist zumindest die obere Lösung nicht falsch zu verstehen, da ja beide Parameter Objekte sind und das in einer Funktions-Dekleration nicht viel Sinn macht.

Edit:
Ideen, Anregungen, Lösungsvorschläge, Resultate mit anderen Compilern etc. sind gerne Willkommen.

--


Dieser Beitrag wurde am 19.04.2007 um 14:50 von hausi bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
19.04.2007, 18:47
Kriz



Hm, sehr merkwürdig, denn von der Syntax her scheint alles ok zu sein (hab das mal in der SGI STL Referenz nachgeschaut). Irgendwie mag er nicht, daß du das Set direkt mit dem istream_iterator initialisierst, obwohl es laut Referenz eigentlich gehen sollte, da istream_iterator ein InputIterator ist.

<Quark stand hier :)>

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)


Dieser Beitrag wurde am 19.04.2007 um 18:48 von Kriz bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche