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”:无法从“unsigned char”转换为“char”

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

4

4 回答 4

10

因为reinterpret_cast根据定义,不是那样工作的。

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

在你的情况下,那将是

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

或者你可以去指针路线做

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

(这是同一件事)。

于 2013-02-04T17:53:40.323 回答
3

因为您需要一个char&引用,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 回答