C2664无法转换参数

时间:2014-02-15 13:04:54

标签: c++ curl 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可以填充最多大小乘以   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()   使用CURLOPT_READDATA设置FILE * userdata。

我有点超出我的深度。

2 个答案:

答案 0 :(得分:0)

freadFILE*作为第四个参数,void*不匹配。假设在将参数传递给参数之前,流的参数是FILE*,则需要将其转换为:

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

BTW reinterpret_cast在语义上更适合此任务:

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

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

答案 1 :(得分: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 ));