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

Привет, я изучаю 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.0VCincludeistream") cannot be referenced -- it is a deleted function

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

спасибо!

2 ответов


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

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

Итак, вместо

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

... do

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

в других новостях ...


вместо

#include "stdafx.h"

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

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

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


вместо

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

... do

istream.clear();

вместо непереносимого Microsoft monstrosity

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

просто используйте standard

int main()

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

auto main() -> int

вместо

system("pause");

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


осуществление разработки

" следует читать поток, пока он не попадает конец файла

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


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


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