首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C2664不能转换参数

C2664不能转换参数
EN

Stack Overflow用户
提问于 2014-02-15 13:04:53
回答 2查看 2.7K关注 0票数 0

我正在实现这个代码,但是我收到了一个错误。

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

错误出现在这段代码中。

代码语言:javascript
复制
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;
}

错误是..。

代码语言:javascript
复制
IntelliSense: argument of type "void *" is incompatible with parameter of type "FILE *" 

代码语言:javascript
复制
Error C2664: 'fread' : cannot convert parameter 4 from 'void *' to 'FILE *' 

任何建议都是有用的。我不明白为什么我们要把一个void *流传递给函数。这到底是什么意思?一个指向虚空的指针?

这里叫它。

代码语言:javascript
复制
/* we want to use our own read function */ 
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);

卷曲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)。 Bug:在进行TFTP上载时,您必须返回回调所需的确切数据量,否则服务器端将将其视为最终数据包,并且传输将在此结束。 如果将此回调指针设置为NULL,或者根本不设置它,则将使用默认的内部读取函数。它正在使用CURLOPT_READDATA对文件* userdata集执行fread()。

我有点过火了。

EN

回答 2

Stack Overflow用户

发布于 2014-02-15 13:21:02

freadFILE*作为其第四个参数,void*不匹配。假设流的参数是FILE*,然后将其传递给参数,则需要对其进行强制转换:

代码语言:javascript
复制
 fread(..., (FILE*)stream);

顺便说一句,reinterpret_cast在语义上更适合这个任务:

代码语言:javascript
复制
fread(..., reinterpret_cast<FILE*>(stream));

void*是可转换为任何其他指针类型的泛型指针类型。

票数 0
EN

Stack Overflow用户

发布于 2014-02-15 13:41:41

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

您可以使用C样式铸造或C++样式铸造。例如

代码语言:javascript
复制
size_t retcode = fread(ptr, size, nmemb, ( FILE * )stream);

代码语言:javascript
复制
size_t retcode = fread(ptr, size, nmemb, reinterpret_cast< FILE *>( stream ));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21797959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档