为什么不将reinterpret_cast转换为'unsigned char'为'char'?

时间:2013-02-04 17:47:59

标签: c++ unix visual-studio-2010

我正在尝试使用MSVC10编译this库,这个函数让我很头疼:

/*! \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&lt; _Elem,_Traits&gt; &amp; std :: basic_istream&lt; _Elem,_Traits&gt; :: get(_Elem&amp;)':无法将参数1从'char'转换为'char&amp;'

原来使用的是static_cast,所以我尝试使用其他地方建议的reinterpret_cast,但也失败了:

  

错误C2440:'reinterpret_cast':无法从'unsigned char'转换为'char'

此库附带unix makefile。解决此编译错误的最佳方法是什么?

4 个答案:

答案 0 :(得分:9)

因为reinterpret_cast根据定义不起作用。

为了执行内存重新解释,您必须将reinterpret_cast应用于指针或引用。如果您想将unsigned char数据重新解释为char数据,则实际上您必须转换为char &类型,而不是char类型。

在你的情况下

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

或者你可以去指针路线并做

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

(这是同样的事情)。

答案 1 :(得分:3)

因为你需要char&引用char,但转换的结果是r值,因此不能与引用绑定。

您需要以下内容:

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

但在这种特殊情况下你可以/应该使用static_cast<char&>

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

<击>

答案 2 :(得分: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]);
}

答案 3 :(得分:1)

除了应对铸造问题的其他答案外:

为什么不一次使用istream::read来读取size个字节?这样可以避免手工制作的for循环,并且应该更快。

void _read(std::istream &is, unsigned char *data, int size) {
    is.read(reinterpret_cast<char*>(data), size);
}