簡體   English   中英

為什么不將reinterpret_cast轉換為'unsigned char'為'char'?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM