На функцию нельзя ссылаться, так как это удаленная функция

Здравствуйте, я изучаю C ++ из книги и задаю вопрос ниже

Напишите функцию, которая принимает и возвращает istream&, Функция должна читать поток, пока он не достигнет конца файла. Функция должна печатать то, что она читает, в стандартный вывод. Сбросьте поток так, чтобы он действовал, прежде чем возвращать поток.

#include "stdafx.h"#include <iostream>
#include <istream>
#include <string>
#include <string.h>
#include <list>
#include <vector>
#include <fstream>

std::istream ReadFile(std::istream &iStream)
{
std::string word;
while (iStream >> word)
{}
std::cout << "I read value " << word << std::endl;
iStream.setstate(std::ios::goodbit);
return iStream;

}

int _tmain(int argc, _TCHAR* argv[])
{
ReadFile(std::cin);

system("pause");
return 0;
}

Выше приведена моя попытка, однако я получаю ошибки в строке «return iStream».

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

Я на самом деле не знаю, что это за ошибки, я знаю, что вы можете удалить материал, но я пока не рассматриваю эту тему в книге. Насколько я знаю, я совсем не трогал файл istream … Может кто-нибудь помочь мне, пожалуйста?

Спасибо!

17

Решение

Вы не можете вернуть istream по значению, потому что это не для копирования.

Поскольку он не подлежит копированию, конструктор копирования был удален (чтобы обеспечить невозможность копирования), и это является прямой технической причиной диагностики.

Итак, вместо

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

… делать

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

В других новостях, …


Вместо

#include "stdafx.h"

просто отключите предварительно скомпилированные заголовки в настройках проекта Visual Studio.

Это также дает вам более стандартное поведение для включений заголовка.

Если вы этого не сделаете, то настройте проект так, чтобы любое предупреждение о пропуске включения приводило к серьезной ошибке компиляции.


Вместо

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

… делать

istream.clear();

Вместо непереносимого чудовища Microsoft

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

просто используйте стандарт

int main()

или в C ++ 11 синтаксис конечного типа возврата,

auto main() -> int

Вместо

system("pause");

просто запустите вашу программу через Ctrl+F5 в Visual Studio. Или установите точку останова на последней правой скобке main и запустить в отладчике. Или запустите программу из командной строки.


Формулировка упражнений

» должен читать поток, пока он не достигнет конца файла

неоднозначно, но в любом случае чтение слова, как вы делаете, не верно воспроизводит пробелы в потоке. Для более точного воспроизведения содержимого потока вы можете прочитать персонаж по символу или (через getline) линия по линии. Или, вы можете использовать специальный механизм для этой задачи, а именно: читать буфер, который делает все в одном маленьком утверждении.


Наконец, вам не нужны все эти заголовки. Вам нужно только <iostream>и, если вы решите читать строки, также <string>, Кроме того, вам не нужно return 0; в конце mainпотому что это по умолчанию.

34

Другие решения

удаленная функция это специальная функция (конструктор, деструктор, оператор), которая была явно отключена. Если вы внимательно посмотрите на ошибку, вы увидите, что функция basic_istream конструктор копирования, который отключен, потому что istreams не может быть скопирован. Вы пытаетесь скопировать istream, когда вы return istream, поскольку ваша функция объявлена ​​как возвращающая istream (а не, например, возвращая ссылку на istream).

2

По вопросам рекламы [email protected]