C2664 не может преобразовать параметр

Я реализую этот код, но я получаю сообщение об ошибке.

http://curl.haxx.se/libcurl/c/ftpupload.html

Ошибка в этом бите кода.

static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
{
  curl_off_t nread;
  /* in real-world cases, this would probably get this data differently
     as this fread() stuff is exactly what the library already would do
     by default internally */ 
  size_t retcode = fread(ptr, size, nmemb, stream);

  nread = (curl_off_t)retcode;

  fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
          " bytes from file\n", nread);
  return retcode;
}

Ошибки...

IntelliSense: argument of type "void *" is incompatible with parameter of type "FILE *" 

а также

Error C2664: 'fread' : cannot convert parameter 4 from 'void *' to 'FILE *' 

Любые советы будут полезны. Я не понимаю, почему мы передавали поток void * в функцию. Что это хотя бы значит? Указатель на пустоту?

Это называется здесь.

/* we want to use our own read function */ 
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);

CURL API

CURLOPT_READFUNCTION

Передайте указатель на функцию, которая соответствует следующему прототипу: функция size_t ( void *ptr, size_t size, size_t nmemb, void *userdata); Эта функция вызывается libcurl, как только ей нужно прочитать данные, чтобы отправить их партнеру. Область данных, на которую указывает указатель ptr, может быть заполнена не более чем размером, умноженным на число байтов nmemb. Ваша функция должна возвращать фактическое количество байтов, которые вы сохранили в этой области памяти. Возвращение 0 сигнализирует об окончании файла в библиотеку и вызывает остановку текущей передачи.

Если вы останавливаете текущую передачу, возвращая 0 "преждевременно" (то есть до того, как сервер ожидал этого, например, когда вы сказали, что загрузите N байтов и загрузите меньше N байтов), вы можете столкнуться с зависанием сервера "жду остальных данных, которые не придут.

Обратный вызов чтения может вернуть CURL_READFUNC_ABORT, чтобы немедленно остановить текущую операцию, что приведет к коду ошибки CURLE_ABORTED_BY_CALLBACK из передачи (добавлено в 7.12.1)

Начиная с версии 7.18.0, функция может возвращать CURL_READFUNC_PAUSE, что приведет к приостановке чтения из этого соединения. Смотрите curl_easy_pause(3) для более подробной информации.

Ошибки: при загрузке TFTP вы должны вернуть точный объем данных, который требуется для обратного вызова, или он будет считаться окончательным пакетом на стороне сервера, и передача на этом закончится.

Если вы установите для этого указателя обратного вызова значение NULL или не установите его вообще, будет использоваться внутренняя функция чтения по умолчанию. Он выполняет fread() для пользовательских данных FILE *, установленных с помощью CURLOPT_READDATA.

Я немного не в себе.

2 ответа

fread занимает FILE* в качестве четвертого аргумента, void* не совпадает. Предполагая, что аргумент для потока был FILE* перед передачей его параметру необходимо привести его:

 fread(..., (FILE*)stream);

Кстати reinterpret_cast более семантически подходит для этой задачи:

fread(..., reinterpret_cast<FILE*>(stream));

void* является универсальным типом указателя, который можно преобразовать в любой другой тип указателя.

Если бы ваша программа была написана на C, то код был бы действительным, потому что в C типе void * может быть неявно преобразован в указатель любого типа. Однако C++ не позволяет конвертировать неявно void * указатель любого другого типа. Таким образом, вам нужно явно указать тип, в который вы хотите преобразовать объект типа void *

Вы можете использовать приведение в стиле C или C++. Например

size_t retcode = fread(ptr, size, nmemb, ( FILE * )stream);

или же

size_t retcode = fread(ptr, size, nmemb, reinterpret_cast< FILE *>( stream ));
Другие вопросы по тегам