0

次のコード(名前空間stdを使用)を使用して、ファイルの内容を文字列に変換しています。

コード1

string fileToString(const string& filename)
{
    ifstream file(filename, ios::binary);
    if (!file) return "";
    string str(istreambuf_iterator<char>(file),
               (istreambuf_iterator<char>()));
    return str;
}

上記のコードが機能するのは奇妙だと思いますが(string :: size()をWindowsエクスプローラーで見つかった実際のファイルサイズと一致させました)、次のコードは機能しません。

コード2

string fileToString(const string& filename)
{
    ifstream file(filename, ios::binary);
    if (!file) return "";
    string str(istreambuf_iterator<char>(file),
               istreambuf_iterator<char>());
    return str;
}

2番目のパラメーターの前後に括弧がないことに注意してください。2番目の関数は、次のコンパイラエラーを出します。

1エラーC2664:'std :: basic_string <_Elem、_Traits、_Ax> :: basic_string(const std :: basic_string <_Elem、_Traits、Ax>&)':パラメータ1を'std :: string( _cdecl *)から変換できません(std :: istreambuf_iterator <_Elem、_Traits>、std :: istreambuf_iterator <_Elem、Traits>( _cdecl *)(void))'から'const std :: basic_string <_Elem、_Traits、_Ax>& '

2 IntelliSense:「std :: string(std :: istreambuf_iterator> file、std :: istreambuf_iterator>(*)())」から「std :: basic_string、std::allocator>」に変換するための適切なコンストラクターが存在しません

WindowsXPSP3でVisualStudio2010、Win32コンソールアプリケーションを使用しています

驚いたことに、次のコードは期待どおりにコンパイルおよび動作します。

コード3

string fileToString(const string& filename)
{
    ifstream file(filename, ios::binary);
    if (!file) return "";
    return string(istreambuf_iterator<char>(file),
                  istreambuf_iterator<char>());
}

コード2でコンパイラエラーが発生するのはなぜですか?

4

1 に答える 1

3

コード 2 でコンパイラ エラーが発生するのはなぜですか?

コード 2 では、次の行で関数が宣言されているため、コンパイル エラーが発生します。

string str(istreambuf_iterator<char>(file),
           istreambuf_iterator<char>());

関数を宣言します。関数名はstr. 戻り値の型はstring. この関数は次の 2 つのパラメーターを取ります。

  • 最初のパラメーターの型はistreambuf_iterator<char>です。
  • 2 番目のパラメーターは、戻り値が引数を取らないistreambuf_iterator<char> (*)()関数ポインター型の型です。istreambuf_iterator<char>

コード 2 では、 という関数を返しますstrstring関数の戻り値の型に変換できないためfileToString、コンパイル エラーが発生します。

Code1 と Code3 では、そのような問題はなく、期待どおりに動作します。

于 2012-06-12T10:27:28.710 に答える