1. ホーム
  2. c++

[解決済み】削除された関数であるため、関数を参照できない

2022-02-22 23:45:56

質問

こんにちは、私は本から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.0\VC\include\istream") cannot be referenced -- it is a deleted function

私は、これらのエラーが何であるかをよく知りません。私は、あなたがものを削除することができることを知っていますが、私はまだ本の中でそのトピックに取り組んでいません。私が知る限りでは、istreamファイルには全く触れていません。どなたか教えてください。

ありがとうございます。

解決方法は?

を返すことはできません。 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のtrailing return type構文で。

auto main() -> int


の代わりに

system("pause");

でプログラムを実行するだけです。 Ctrl + F5 をVisual Studioで実行します。または、最後の右中括弧にブレークポイントを設定します。 main と入力し、デバッガで実行します。または、コマンドラインから実行してください。


演習の定式化

" は、ファイルの終端にぶつかるまでストリームを読み込む必要があります。

はあいまいですが、とにかく 言葉 のように、ストリームの空白を忠実に再現することはできません。ストリームの内容をより正確に再現するには、次のように読みます。 文字 を1文字ずつ、あるいは getline ) ライン を行単位で表示します。あるいは、この作業のための特別なメカニズム、すなわち、出力された 読み取りバッファ これは、1つの小さなステートメントですべてを行うものです。


最後に、これらのヘッダーはすべて必要ありません。必要なのは <iostream> そして、もしあなたが行を読むことを選択した場合、さらに <string> . また return 0; の末尾にある main というのも、これがデフォルトだからです。