C++ C2664无法转换参数

C++ C2664无法转换参数,c++,curl,c2664,C++,Curl,C2664,我正在实现此代码,但收到一个错误 错误就在这段代码中 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 l

我正在实现此代码,但收到一个错误

错误就在这段代码中

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 *" 

任何提示都是有用的。我不明白为什么我们要将void*流传递给函数。这到底是什么意思?指向空白的指针

这里叫它

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

CURLOPT_函数

将指针传递给与以下原型匹配的函数: 大小函数(void*ptr,size\t size,size\t nmemb,void *用户数据);当libcurl需要读取数据以便将其发送给对等方时,它就会调用此函数。指向的数据区域 通过指针,ptr最多可填入乘以的大小 nmemb字节数。您的函数必须返回 存储在该内存区域中的字节。返回0将发出信号 结束文件到库并使其停止当前传输

如果您通过返回0“预到期”(即 在服务器预期它之前,比如当你说你将上传N 如果您上载的字节数小于N字节),您可能会遇到 服务器“挂起”等待其余的数据不会出现

读取回调可能返回CURL\u READFUNC\u ABORT以停止当前操作 操作立即执行,导致CURLE_按_中止_回调错误 传输代码(在7.12.1中添加)

从7.18.0开始,函数可以返回CURL\u READFUNC\u PAUSE,然后 将导致从此连接的读取暂停。看见 卷曲\u轻松\u暂停(3)了解更多详细信息

错误:在执行TFTP上载时,必须返回正确的 回调需要的数据,否则将被视为最终数据 数据包由服务器端发送,传输将在那里结束

如果将此回调指针设置为NULL,或者根本不设置它,则 将使用默认的内部读取功能。它正在做一个fread()的测试 文件*userdata集包含CURLOPT_READDATA


我有点不知所措。

fread
文件*
作为其第四个参数,
无效*
不匹配。假设stream的参数是一个
文件*
,在将其传递给参数之前,您需要强制转换它:

 fread(..., (FILE*)stream);
顺便说一句,
reinterpret\u cast
在语义上更适合此任务:

fread(..., reinterpret_cast<FILE*>(stream));
fread(…,重新解释(stream));

void*
是一种通用指针类型,可转换为任何其他指针类型。

如果您的程序是用C编写的,那么代码将是有效的,因为在C类型中
void*
可以隐式转换为任何类型的指针。但是C++不允许隐式地将代码>代码>空>代码>转换为任何其他类型的指针。因此,您需要显式地将类型指定为要转换类型为
void*

可以使用C样式铸件或C++风格铸件。比如说

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

size\u t retcode=fread(ptr,size,nmemb,reinterpret\u cast(stream));

fread
文件*
作为其第四个参数,
void*
不匹配。假设
stream
的参数是
文件*
,在将其传递给参数之前,您需要强制转换它:
fread(…,(FILE*)stream)
@0x499602D2实际上将文件作为最后一个参数;不是第一次。cast分辨率显然仍然正确;只需移动它=P.@WhozCraig-Oops!谢谢你指出这一点。让我来解决这个问题。:)
size_t retcode = fread(ptr, size, nmemb, ( FILE * )stream);
size_t retcode = fread(ptr, size, nmemb, reinterpret_cast< FILE *>( stream ));