C++ visualc&x2B+;表格申请错误:C3374

C++ visualc&x2B+;表格申请错误:C3374,c++,forms,curl,download,C++,Forms,Curl,Download,我已经研究了好几个小时了。我对C++非常陌生,目前还不明白我发现的任何解决方案。 我试图在我的表单应用程序中创建一个cURL文件下载程序,但我遇到了这个该死的错误: Error 50 error C3374: can't take address of 'EmperorAntiVirusInstaller::FileDownloader::write_data' unless creating delegate instance c:\users\bailey\documents\v

我已经研究了好几个小时了。我对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);

我希望找到一个很好的解释和简单的答案来解决这个问题/

您正在尝试向成员函数传递指针。它需要一个指向非成员函数的指针。您需要编写一个函数来完成您需要的任务,但不能作为类的成员

至少在内存可用的情况下,如果您只想将数据写入调用中使用
CURLOPT_WRITEDATA
指定的文件,则根本不需要使用
CURLOPT_WRITEFUNCTION
——默认函数只需将数据写入传递的文件


<>我想我也应该提到(基于错误消息中的委托实例),你似乎使用C++ + CLI代替了实际C++。如果是这样的话,几乎所有其他问题都可能至少会有一个小问题——C++ + CLI在某些方面有点像C++,但是仅仅是足够多的其他问题,在半规则的基础上会导致问题。

是否应该足够使方法>代码> WrreWordDea/Case>静态成员?@哈珀:在正常C++下,是的,可能是。在C++/CLI下,我不太确定。