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
*данные пользователя); Эта функция вызывается libcurl, как только ей нужно прочитать данные, чтобы отправить их партнеру. Область данных указала на
по указателю ptr может быть заполнен не более чем на размер, умноженный на
число байт. Ваша функция должна возвращать фактическое количество
байты, которые вы сохранили в этой области памяти. Возвращение 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 или не установите его вообще,
будет использоваться внутренняя функция чтения по умолчанию. Это делает фред () на
пользовательские данные FILE *, установленные с помощью CURLOPT_READDATA.

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

0

Решение

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

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

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

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

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

0

Другие решения

Если бы ваша программа была написана на 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 ));
0