函数不能被引用,因为它是一个已删除的函数

Function cannot be referenced as it is a deleted function

本文关键字:函数 一个 删除 不能 引用 因为      更新时间:2023-10-16

你好,我正在从一本书中学习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文件。。。有人能帮帮我吗?

谢谢!

您可以;不要按值返回istream,因为它;It’不可复制。

因为;s不可复制复制复制构造函数已被删除(以强制执行不可复制性),并且;这是诊断的直接技术原因。

所以,不是

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

…进行

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

在其他新闻中,…


代替

#include "stdafx.h"

只需关闭Visual Studio项目设置中的预编译头即可。

这也为收割台夹杂物提供了更标准的一致性行为。

如果您不这样做;不要这样做,然后配置项目,以便任何关于跳过include的警告都会产生硬编译错误。


代替

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)逐行读取。或者,您可以为此任务使用一种特殊的机制,即输出读取缓冲区,它在一个小语句中完成所有操作。


最后,您不会;I don’我不需要那些标题。您只需要<iostream>,如果您选择读取行,还需要<string>。此外,您不会;不需要main末尾的return 0;,因为;s为默认值。

已删除的函数是一个已显式禁用的特殊函数(构造函数、析构函数、运算符)。如果您仔细查看该错误,您可以看到该函数是basic_istream复制构造函数,该构造函数被禁用,因为istreams无法复制。当return istream时,您正试图复制istream,因为您的函数被声明为返回istream(而不是例如返回对istream的引用)。

相关文章: