2012-04-06 2 views
3

solch ein Code-Segment Gegeben:Strange Fehler beim Verwenden der Vorlage <Klasse InputIterator> Zeichenfolge (InputIterator begin, InputIterator end);

#include <iostream> 
#include <iterator> 
#include <fstream> 
#include <string> 
using namespace std; 
int main(){ 
    ifstream file("1.txt"); 
    string str((istream_iterator<char>(file)),istream_iterator<char>()); 
    file.close(); 
    cout<<str<<endl; 
} 

Der Code konstruiert eine Zeichenfolge aus einer Datei istream_iterator verwenden.

Beachten Sie, dass der erste Parameter des Zeichenfolgenkonstruktors mit einem Paar Klammern eingeschlossen ist. Wenn ich die Klammern weglasse, wird ein Fehler angezeigt. In VC++ 2008 wird ein Verbindungsfehler auftreten. In G ++ hat der Code eine falsche Ausgabe.

Ich fühle mich sehr seltsam über die Klammern. Was ist der Unterschied und warum?

Antwort

5

Ohne die „extra“ Klammern, erhalten Sie C++ 's ‚drängendsten Parse‘ - stattdessen ein Objekt definieren str mit den beiden istream_iterators Namen seiner initializers angeben, es als eine Deklaration einer Funktion analysiert hat str benannt, eine zurückgibt string, und das "Zeug" in Klammern gibt die Art der Parameter an, die es braucht.

1

Es sieht wie eines der Beispiele für "C++ am meisten ärgerlichen Parse" Problem aus. Sieht so aus, als würde der Compiler die Anweisung mit () als Funktionsdeklaration der Funktion str interpretieren, die zwei Parameter akzeptiert. Wenn Sie () hinzufügen, informieren Sie den Compiler darüber, dass es sich um ein Objekt und nicht um einen Teil der Funktionsprototypsignatur handelt.

Verwandte Themen