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):
#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:
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:
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.
|