我正在尝试使用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。解决此编译错误的最佳方法是什么?
答案 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);
}