2015-02-12 15 views
8

Ich versuche Wörter von einer Datei in eine andere in cpp zu kopieren, hier ist mein Code:Kopieren Wörter aus einer Datei zur anderen in cpp

int main() 
{ 

    string from, to; 

    cin >> from >> to; 

    ifstream ifs(from); 

    ofstream ofs(to); 

    set<string> words(istream_iterator<string>(ifs), istream_iterator<string>()); 
    copy(words.begin(), words.end(), ostream_iterator<string>(ofs, "\n")); 

    return !ifs.eof() || !ofs; 
} 

So kann ich einen Kompilierungsfehler erhalten:

expression must have class type 

an der Linie, wo ich anrufen copy()

Wenn ich den Aufbau der Iteratoren folgendes ändern funktioniert es:

set<string> words{ istream_iterator<string>{ ifs }, istream_iterator<string>{} }; 

Ich dachte, die Wahl zwischen() und {} beim Initialisieren von Objekten in cpp ist nur eine Frage der Wahl, aber ich denke, ich liege falsch. Kann mir das jemand erklären?

+0

Eigentlich 'set Wörter (istream_iterator {ifs}, istream_iterator {});' ist genug – Slava

Antwort

2

In dem ersten Codefragment wird die Linie set<string> words(istream_iterator<string>(ifs), istream_iterator<string>())words als eine Erklärung einer Funktion analysiert, die zwei Parameter: istream_iterator<string> ifs und eine unbenannte Parameter des Typs istream_iterator<string> und einen set<string> zurückgibt. Deshalb gibt es einen Kompilierungsfehler. Der zweite kann nicht als Funktionsdeklaration geparst werden, also funktioniert es richtig.

+0

Warum 'istream_iterator (ifs)' als eine Art analysiert? – Slava

+0

@Slava Der gesamte Ausdruck kann als Deklaration einer Funktion mit zwei Parametern analysiert werden ('istream_iterator ifs' und' istream_iterator ) ', und genau das passiert. Warum? Nun, weil der C++ - Standard das sagt (auch wenn es in diesem Zusammenhang keinen Sinn macht). – kraskevich

+0

'istream_iterator (ifs)' sollte nicht als Parameter analysiert werden, das ist das Problem – Slava

Verwandte Themen