您好我正在从一本书中学习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;
}
以上是我的尝试,但是我在&#34;返回iStream&#34;线。
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文件......有人可以帮我吗?
谢谢!
答案 0 :(得分:35)
您无法按值返回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();
而不是非便携式微软怪物
int _tmain(int argc, _TCHAR* argv[])
只需使用标准
int main()
或C ++ 11尾随返回类型语法
auto main() -> int
而不是
system("pause");
只需在Visual Studio中通过 Ctrl + F5 运行程序。或者,在main
的最后一个右括号上放置一个断点并在调试器中运行。或者,从命令行运行该程序。
运动表格
“应该读取流,直到它到达文件结尾
是不明确的,但无论如何,正如你所做的那样,阅读单词并不忠实地再现流中的空白。为了更准确地再现流内容,您可以逐个字符地读取字符,或者逐行读取(通过getline
)行。或者,您可以使用特殊机制执行此任务,即输出读取缓冲区,它可以在一个小语句中执行所有操作。
最后,您不需要所有这些标头。您只需要<iostream>
,如果您选择阅读行,也需要<string>
。此外,您不需要return 0;
末尾的main
,因为这是默认设置。
答案 1 :(得分:2)
已删除的函数是一个已明确禁用的特殊函数(构造函数,析构函数,运算符)。如果仔细查看错误,可以看到该函数是basic_istream
复制构造函数,由于 istreams无法复制而被禁用。您正试图在return istream
时复制istream,因为您的函数被声明为返回istream
(而不是例如返回对istream
的引用)。