На функцию нельзя ссылаться, так как она является удаленной функцией
Привет, я изучаю 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
).