无法引用函数,因为它是已删除的函数

时间:2014-09-13 21:34:34

标签: c++

您好我正在从一本书中学习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文件......有人可以帮我吗?

谢谢!

2 个答案:

答案 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的引用)。