4

私はMSVC10を使用してこのライブラリをコンパイルしようとしていますが、この関数は私に頭痛の種を与えています:

/*! \brief Read bytes from a \c std::istream
    \param is The stream to be read.
    \param data A pointer to a location to store the bytes.
    \param size The number of bytes to be read.
*/
void _read(std::istream &is, unsigned char *data, int size)
{
    for (int i=0; i < size ; ++i )
      is.get(static_cast<char>(data[i]));
}

エラーC2664:'std :: basic_istream <_Elem、_Traits>&std :: basic_istream <_Elem、_Traits> :: get(_Elem&)':パラメータ1を'char'から'char&'に変換できません

オリジナルはstatic_castを使用していたので、他の場所で提案されているようにreinterpret_castを試してみましたが、それも失敗します。

エラーC2440:'reinterpret_cast':'unsignedchar'から'char'に変換できません

このライブラリには、unixmakefileが付属しています。このコンパイルエラーを解決するための最良の方法は何ですか?

4

4 に答える 4

10

reinterpret_cast定義上、そのようには機能しないためです。

メモリの再解釈を実行するにはreinterpret_cast、ポインターまたは参照に適用する必要があります。unsigned charデータをデータとして再解釈したい場合はchar、実際にはchar &型ではなく型に変換する必要がありますchar

あなたの場合、それは

is.get(reinterpret_cast<char &>(data[i]));

または、ポインタールートに移動して実行できます

is.get(*reinterpret_cast<char *>(&data[i]));

(これは同じことです)。

于 2013-02-04T17:53:40.323 に答える
3

char&への参照であるa が必要ですがchar、キャストの結果は右辺値であるため、参照にバインドできません。

次のようなものが必要です:

is.get(reinterpret_cast<char&>(data[i]));

ただし、この特定のケースでは、次を使用できます/使用する必要がありますstatic_cast<char&>

is.get(static_cast<char&>(data[i]));

于 2013-02-04T17:53:57.320 に答える
1

代わりにこれを試してください:

void _read(std::istream &is, unsigned char *data, int size)
{
    for (int i=0; i < size ; ++i )
      is.get(reinterpret_cast<char*>(data)[i]);
}
于 2013-02-04T17:50:54.063 に答える
1

キャストの問題に対処する他の回答に加えて:

一度にバイトistream::readを読み取るために使用してみませんか?sizeこれにより、手作りの for ループが回避され、高速になるはずです。

void _read(std::istream &is, unsigned char *data, int size) {
    is.read(reinterpret_cast<char*>(data), size);
}
于 2013-02-04T17:59:18.913 に答える