2014-09-13 5 views
13

Hallo ich C++ lerne aus einem Buch und bin auf einer Übung Frage unterFunktion kann nicht referenziert werden, da es eine gelöschte Funktion ist

Schreiben Sie eine Funktion, die nimmt und gibt ein istream &. Die Funktion sollte den Stream lesen, bis er das Ende der Datei erreicht. Die Funktion sollte das, was sie liest, auf die Standardausgabe ausgeben. Setzen Sie den Stream so zurück, dass er gültig ist, bevor der Stream zurückgegeben wird.

Das obige ist mein Versuch, jedoch bekomme ich Fehler bei der "Return iStream" -Linie.

Error1 error C2280: 'std::basic_istream<char,std::char_traits<char>>::basic_istream(const std::basic_istream<char,std::char_traits<char>> &)' : attempting to reference a deleted function 

2 IntelliSense: function "std::basic_istream<_Elem, _Traits>::basic_istream(const std::basic_istream<_Elem, _Traits>::_Myt &) [with _Elem=char, _Traits=std::char_traits<char>]" (declared at line 77 of "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\istream") cannot be referenced -- it is a deleted function 

Ich weiß nicht wirklich, was diese Fehler sind, wie ich bin mir bewusst, Sie Sachen löschen können, aber ich bin nicht auf dieses Thema in dem Buch vor. Soweit ich weiß, habe ich die iStream-Datei überhaupt nicht berührt ... Kann mir bitte jemand helfen?

Danke!

+1

Die Spezifikation ist * ziemlich * klar. – chris

+1

'ReadFile' sollte statt' iStream.setstate (std :: ios :: goodbit) ''std :: istream \' und' iStream.clear() 'zurückgeben' –

+0

Ich hatte diesen Fehler, wenn ich ein Projekt in ein Visual portierte Studio 2015 UWP App. Ich habe einen Kopierkonstruktor zu der Klasse hinzugefügt, über die sie sich beschwert hat, und das Problem ist gelöst. – thehelix

Antwort

26

Sie können ’ t einen istream Wert zurückgeben, weil es ’ s nicht kopierbar ist.

Da es ’ nicht kopierbar ist, wurde der Kopierkonstruktor gelöscht (um die Nichtkopierbarkeit zu erzwingen), und das ’ ist die direkte technische Ursache der Diagnose.

Anstatt also

std::istream ReadFile(std::istream &iStream) 

& hellip; tun

std::istream& ReadFile(std::istream& iStream) 

In anderen Nachrichten, & hellip;


Statt

#include "stdafx.h" 

nur vorkompilierte Header in der Visual Studio-Projekteinstellungen deaktivieren.

Dadurch erhalten Sie auch mehr standardkonformes Verhalten für Header-Einschlüsse.

Wenn Sie dies nicht tun, konfigurieren Sie das Projekt so, dass jede Warnung über das Überspringen eines Includes einen harten Kompilierungsfehler ergibt.


Statt

iStream.setstate(std::ios::goodbit); 

& hellip; do

istream.clear(); 

Anstelle der nicht tragbar Microsoft Ungeheuerlichkeit

int _tmain(int argc, _TCHAR* argv[]) 

nur verwenden Standard

int main() 

oder in C++ 11 nachlaufRückgabeTyp Syntax,

auto main() -> int 

Statt

system("pause"); 

einfach Ihr Programm über Ctrl +F5 in Visual Studio ausgeführt. Oder platzieren Sie einen Haltepunkt auf der letzten rechten Klammer von main und führen Sie im Debugger. Oder führen Sie das Programm über die Befehlszeile aus.


Die Übung Formulierung

den Stream lesen sollte, bis er trifft End-of-Datei

nicht eindeutig ist, aber trotzdem Worte, wie Sie ’ lesen re tut, reproduziert nicht genau Whitespace im Stream. Für eine genauere Wiedergabe des Stream-Inhalts können Sie entweder Zeichen nach Zeichen oder (über getline) Zeile nach Zeile lesen. Oder Sie können einen speziellen Mechanismus für diese Aufgabe verwenden, nämlich die Ausgabe des Lesepuffers, der alles in einer kleinen Anweisung ausführt.


Schließlich, Sie don ’ t brauchen all diese Header. Sie benötigen nur <iostream>, und wenn Sie sich entscheiden, Zeilen zu lesen, auch <string>. Auch Sie don ’ t brauchen die return 0; am Ende main, weil das ’ s der Standard ist.

+0

Normalerweise deklarieren Sie Referenzen nicht mit "& d", wie kommt es, dass Sie den Verweis vor dem Rückgabetyp oder warum nicht als & std :: istream angegeben haben? Ich verwende die Header nur, damit ich während des Lernens verschiedene Dinge üben/ausprobieren kann. Wie Vektoren für bestimmte Probleme oder etwas verwenden. Auch verstehe ich nicht, warum meine Art, Wörter zu lesen, schlecht ist. Ich meine, ich weiß, dass es schlecht ist, aber ich verstehe nicht warum. – Foysal94

+0

@ user3216729: Die Syntax für eine Deklaration einer benannten Referenz beginnt mit * Type * '&' * name *. Sie können das als 'Type & name' oder als' Type & name' eingeben. In C++, mit seinem Fokus auf starke Typisierung, ist "Typ &" natürlich, während in Variable-orientiertem C (wenn C Referenzen hatte, was nicht!) '& Name', wie Sie geschrieben hatten, natürlicher wäre. Der letztere Weg macht es klarer, was eine Deklaration mit mehreren Namen bedeutet, wichtig in C. In C++ sollte man Deklarationen mit mehreren Namen vermeiden. –

+0

@ user3216729: in Bezug auf das Lesen von Wörtern, wenn, wie die Übung etwas * impliziert *, der Punkt besteht darin, den Stream Inhalt zu reproduzieren, dann lesen Wörter können nicht sagen, wie viel Leerzeichen gibt es zwischen Wörtern, wie Leerzeichen, Tabs, Zeilenumbrüche , so dass das nicht reproduziert werden kann. Beachten Sie jedoch, dass in Windows nur rein textuelle Stream-Inhalte von einem reinen Standard-C++ - Programm auch beim byteweisen Lesen getreu wiedergegeben werden können, da * text mode * mit Zeilenenden und ASCII 26 (Ctrl Z), was für Windows-Text wütet wird als Dateiende interpretiert. –

2

Eine gelöschte Funktion ist eine spezielle Funktion (Konstruktor, Destruktor, Operator), die explizit deaktiviert wurde. Wenn Sie sich den Fehler genau ansehen, können Sie sehen, dass die Funktion basic_istream copy-constructor ist, die deaktiviert ist, weil istreams nicht kopiert werden kann. Sie versuchen, den iStream zu kopieren, wenn Sie return istream haben, da Ihre Funktion so deklariert ist, dass sie eine istream zurückgibt (anstatt beispielsweise einen Verweis auf eine istream zurückzugeben).

+1

Um ich schaue auf die Fehler und ich bekomme nicht wirklich die Syntax. Wie "_ _Elem, _Traits>" Keine Ahnung, was das ist, aber ich werde lernen, wie ich weitermache. Allerdings verstehe ich, was mein Gesamtproblem nun war und wie ich es beheben konnte, danke für die Hilfe! – Foysal94

Verwandte Themen