gcc std :: istream'错误:从'std :: streamsize'类型无效转换为'std :: streamsize''

时间:2011-02-10 10:31:40

标签: c++ gcc casting iostream

好吧,所以这里真的很奇怪。我正在将原始数据读入缓冲区,没什么特别的,我的代码是这样的:

typedef unsigned char Byte;
/* ... */
static Byte SerializeBuffer[2048];
/* ... */
std::streamsize readInBuffer = 
                data.read((char*)SerializeBuffer, sizeof(SerializeBuffer));

但是我会继续收到编译错误消息'error: invalid cast from type ‘void *’ to type ‘std::streamsize’',不知道为什么编译器认为sizeof是一个void指针。好吧,我试过用几种方法来铸造它,但同样的错误不断发生。我最终得到了这个:

std::streamsize dummy = sizeof(SerializeBuffer);
std::streamsize readInBuffer = 
                data.read((char*)SerializeBuffer, reinterpret_cast<std::streamsize>(dummy));

弹出以下内容:error: invalid cast from type ‘std::streamsize’ to type ‘std::streamsize’

我完全失败了。还有其他想法吗?

编译器:gcc 4.4.5
操作系统:Linux 2.6.35

修改 Visual Studio 2010上的相同内容

4 个答案:

答案 0 :(得分:3)

如果dataistream,请记住,成员read会返回对data(流本身)的引用,而不是读取的字符数。

void *的原因可能是因为编译器将它分配给std::streamsize成员,尝试使用隐式转换为void *(当你执行if(data) ...时使用的转换{1}}),但仍然void *std::streamsize不匹配。

顺便说一句,在使用gcount方法调用read之后,可以获取有关读取的字符数的信息。

答案 1 :(得分:1)

您应该查看documentation。 Read返回对流的引用。所以发生的事情是:

  1. 您调用read,返回istream&amp;。
  2. 您尝试将该istream分配给std :: streamsize。
  3. 由于编译器找不到合适的方法,因此尝试将流的operator void *的结果赋给std :: streamsize。
  4. 由于您无法分配这些类型,因此会产生错误。

答案 2 :(得分:0)

必须是std::streamsize readInBuffer = data.read(...部分。 read不返回大小,而是返回流本身。

答案 3 :(得分:-1)

如果您想知道读取了多少字节,请使用readsome()而不是read()