2016-07-13 12 views
1
int function1(string data){ 
     stringstream ss(data); 
     return function2(ss); 
    } 
    int function2(stringstream& ss){ 
     string val; 
     getline(ss,val,','); 
     return stoi(val); 
    } 

Wenn ich ändern function2 zuwie getline Arbeiten in diesem Code

int function2(stringstream ss){...} 

Es funktioniert nicht. Ich würde gerne wissen warum? Der compliation Fehler

Verwendung gelöscht Funktion ‚std :: basic_stringstream < _CharT, _Traits, _Alloc> :: basic_stringstream (const std :: basic_stringstream < _CharT, _Traits, _Alloc> &) [mit _CharT = char; _Traits = std :: char_traits; _Alloc = std :: allocator] '

Und eine andere Frage ist ich bin gespannt wie getline tatsächlich funktioniert. Wie der folgende Code:

while(!getline(ss,val,',')) 
     cout<<val; 

Wie verfolgt getline die Position des Iterators nach einer Iteration?

+0

Explain "funktioniert nicht"? Erhalten Sie einen Compilerfehler oder einen Laufzeitfehler? –

+1

'getline()' ist nicht verantwortlich für die Position im _ ** stream ** _ (Hinweis). –

+0

@DavidThomas könnten Sie mehr erklären? Ich habe wirklich keine Ahnung –

Antwort

1

Die Definition int function2(stringstream ss) erfordert die Verwendung des Konstruktors für gelöschte Kopien unter stringstream. stringstream hat den Kopierkonstruktor und den Kopierzuweisungsoperator gelöscht. streamstream erlaubt Bewegungen.

getline() verfolgt den Stream nicht. stringstream Die Klassendefinition stammt von einem streambuf, der für diese Details verantwortlich ist.

2

Da Sie versuchen, die ss Stream kopieren und Methode kopieren wird mit (relativ) neue C++ - Syntax gelöscht, so tritt der Fehler auf.

Sie nicht zulassen, Stream zu kopieren, so dass Sie es einer Funktion geben möchten, müssen Sie Referenz verwenden. http://en.cppreference.com/w/cpp/language/function#Deleted_functions

  • string Konstruktor:

    Sie können einige Informationen über