1

私のコードの何が問題なのかわかりません。コンソールから 2 つのファイルのファイル パスを取得しようとしています。次に、それらのファイルを使用していくつかの fstream オブジェクトを初期化し、1 つには fstream オブジェクトを初期化しios::in | ios::out、もう 1 つには追加しios::binaryます。

私のコードの重要な部分は次のとおりです。

// Function prototypes
void INPUT_DATA(fstream);
void INPUT_TARGETS(fstream);

int main()
{
    // Ask the user to specify file paths
    string dataFilePath;
    string targetsFilePath;
    cout << "Please enter the file paths for the storage files:" << endl
        << "Data File: "; 
    getline(cin, dataFilePath); // Uses getline() to allow file paths with spaces
    cout << "Targets File: "; 
    getline(cin, targetsFilePath);

    // Open the data file
    fstream dataFile;
    dataFile.open(dataFilePath, ios::in | ios::out | ios::binary);

    // Open the targets file
    fstream targetsFile;
    targetsFile.open(targetsFilePath, ios::in | ios::out);

    // Input division data into a binary file, passing the proper fstream object        
    INPUT_DATA(dataFile);

    // Input search targets into a text file
    INPUT_TARGETS(targetsFile);

    ...
}

// Reads division names, quarters, and corresponding sales data, and writes them to a binary file
void INPUT_DATA(fstream dataFile)
{
    cout << "Enter division name: ";
    ... 
    dataFile << divisionName << endl;
    ...
}

// Reads division names and quarters to search for, and writes them to a file
void INPUT_TARGETS(fstream targetsFile)
{
    cout << "\nPlease input the search targets (or \"exit\"):";
    ...
    targetsFile.write( ... );
    ...
}

ただし、Visual Studio は、INPUT_DATA(dataFile);andINPUT_TARGETS(targetsFile);の部分で次のように叫びます。

function "std::basic_fstream<_Elem, _Traits>::basic_fstream(const std::basic_fstream<_Elem, _Traits>::_Myt &) [with _Elem=char, _Traits=std::char_traits<char>]" (declared at line 1244 of "c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\fstream") cannot be referenced -- it is a deleted function

行 1244 が見つかるまでヘッダー ファイルを調べました。

basic_fstream(const _Myt&) = delete;

なぜこれが起こっているのか分かりません。私はまだC++にかなり慣れていないので、ばかげたことをしただけかもしれませんが、誰か助けてもらえますか?

編集:明確なタイトル

4

2 に答える 2

3

a をコピーすることはできないstd::fstreamため、掘り下げてわかったように、コピーコンストラクターは削除されます:)

をコピーする理由もありませんstd::fstreamstd::fstreamあなたの場合、元の 、で作成したものを変更しmain、まったく新しいものを作成したくないため、参照渡しする必要があります(そのため、コピーコンストラクターが削除されます、 btw :))。

于 2016-06-21T17:57:02.143 に答える
2

これは、 のコピー コンストラクターstd::fstreamが削除されているためです。値で渡すことはできません。これを解決するには、std::fstream次のように 's を参照渡しします。

void INPUT_DATA(fstream& dataFile) { /* ... */ }
void INPUT_TARGETS(fstream& targetsFile) { /* ... */ }

コードの他の部分を変更する必要はありません。

于 2016-06-21T17:56:46.977 に答える