gcc std :: istream 'error: неверное приведение типа from std :: streamsize ’к типу‘ std :: streamsize ’' - PullRequest
2 голосов
/ 10 февраля 2011

Хорошо, вот действительно странный.Я читаю необработанные данные в буфер, ничего необычного, мой код выглядел так:

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 былпустой указательНу, я попытался разыграть его несколькими способами, но одна и та же ошибка продолжала происходить.Я закончил с этим:

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

edit: То же самое в Visual Studio 2010

Ответы [ 4 ]

3 голосов
/ 10 февраля 2011

Если data является istream, имейте в виду, что элемент read возвращает ссылку на data (сам поток), а не количество прочитанных символов.

The void * вещи, вероятно, потому что компилятор, чтобы назначить его члену std::streamsize, пытается использовать неявное преобразование в void * (то, которое используется, когда вы делаете if(data) ...), но все равно void *хорошее совпадение для std::streamsize.

Кстати, информацию о количестве прочитанных символов можно получить после вызова read, используя метод gcount.

1 голос
/ 10 февраля 2011

Вам следует проверить документацию . Read возвращает ссылку на поток. Итак, что происходит:

  1. Вы вызываете read, который возвращает istream &.
  2. Вы пытаетесь присвоить этот поток потоку std :: streamsize.
  3. Поскольку компилятор не находит подходящего способа сделать это, он пытается присвоить результат оператора потока void * вашему std :: streamsize.
  4. Поскольку вы не можете назначить эти типы, возникает ошибка.
0 голосов
/ 10 февраля 2011

Если вы хотите узнать, сколько байтов было прочитано, используйте readsome(), а не read()

0 голосов
/ 10 февраля 2011

Это должна быть часть std::streamsize readInBuffer = data.read(....read не возвращает размер, но сам поток.

...