[英]Why does casting unsigned char* to char* require reinterpret_cast?
[英]Why doesn't reinterpret_cast convert 'unsigned char' to 'char'?
我正在嘗試使用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':無法從'unsigned char'轉換為'char'
該庫附帶unix makefile。 解決此編譯錯誤的最佳方法是什么?
因為根據定義, reinterpret_cast
不能以這種方式工作。
為了執行內存重新解釋,您必須將reinterpret_cast
應用於指針或引用。 如果要將unsigned char
數據重新解釋為char
數據,則實際上必須轉換為char &
type,而不是char
類型。
在你的情況下,將是
is.get(reinterpret_cast<char &>(data[i]));
或者你可以去指針路線做
is.get(*reinterpret_cast<char *>(&data[i]));
(這是一回事)。
因為你需要一個char&
並且它是對char
的引用,但是轉換的結果是一個r值,因此不能綁定到引用。
你需要這樣的東西:
is.get(reinterpret_cast<char&>(data[i]));
但在這種特殊情況下,您可以/應該使用
static_cast<char&>
:
is.get(static_cast<char&>(data[i]));
試試這個:
void _read(std::istream &is, unsigned char *data, int size)
{
for (int i=0; i < size ; ++i )
is.get(reinterpret_cast<char*>(data)[i]);
}
除了應對鑄造問題的其他答案:
為什么不直接使用istream::read
讀取size
字節? 這樣可以避免手工制作的for循環,並且應該更快。
void _read(std::istream &is, unsigned char *data, int size) {
is.read(reinterpret_cast<char*>(data), size);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.