Подтвердить что ты не робот

Функция не может ссылаться, поскольку она является удаленной функцией

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

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

#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... Может ли кто-нибудь помочь мне, пожалуйста?

Спасибо!

4b9b3361

Ответ 1

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

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

Итак, вместо

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

& hellip; сделать

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

В других новостях, & hellip;


Вместо

#include "stdafx.h"

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

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

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


Вместо

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

& hellip; сделать

istream.clear();

Вместо не переносимого монстра Microsoft

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

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

int main()

или в синтаксисе типа возвращаемого типа С++ 11,

auto main() -> int

Вместо

system("pause");

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


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

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

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


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

Ответ 2

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