0

我已经研究了好几个小时了。我对 C++ 很陌生,到目前为止我还没有找到任何解决方案。

我正在尝试在我的表单应用程序中创建一个 cURL 文件下载器,但我收到了这个该死的错误:

Error   50  error C3374: can't take address of 'EmperorAntiVirusInstaller::FileDownloader::write_data' unless creating delegate instance    c:\users\bailey\documents\visual studio 2010\projects\emperor antivirus installer\emperor antivirus installer\FileDownloader.h  97

代码如下:

private:
    size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
        size_t written;
        written = fwrite(ptr, size, nmemb, stream);
        return written;
    }
    System::Void beginDownload(void) {
        CURL *curl;
        FILE *fp;
        CURLcode res;
        char *url = "http://localhost/aaa.txt";
        char outfilename[FILENAME_MAX] = "C:\\bbb.txt";
        curl = curl_easy_init();
        if(curl) {
            fp = fopen(outfilename,"wb");
            curl_easy_setopt(curl, CURLOPT_URL, url);
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &FileDownloader::write_data);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
            res = curl_easy_perform(curl);
            curl_easy_cleanup(curl);
            fclose(fp);
        }
    }

此外,表单的名称是 FileDownloader。

错误行是:

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &FileDownloader::write_data);

我正在寻找关于如何解决此问题的很好解释且简单的答案。:/

4

1 回答 1

1

您正在尝试将指针传递给成员函数。它需要一个指向非成员函数的指针。您需要编写一个函数来满足您的需求,但不是作为类的成员。

至少如果内存服务,如果您只想将数据写入您在调用中指定的文件CURLOPT_WRITEDATA,您根本不需要使用CURLOPT_WRITEFUNCTION- 默认函数只会将数据写入您传递的文件。

但是,我想我还应该提到(基于错误消息中提到的委托实例)您似乎使用的是 C++/CLI 而不是真正的 C++。如果是这样的话,几乎所有其他东西都可能至少有一个小问题——C++/CLI 在某些方面有点像 C++,但其他方面的不同足以在半定期的基础上引起问题。

于 2012-05-03T03:58:49.207 回答