2012-05-03 2 views
0

Я занимаюсь этим часами. Я ОЧЕНЬ новичок в C++ и не понимаю решений, которые я нашел до сих пор.Visual C++ Forms Application Error: C3374

Я пытаюсь сделать завиток загрузчик файлов в моем виде приложения, но я получаю эту ошибку проклятую:

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.

erroring линия:

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

Я ищу, чтобы найти хорошо объяснил & простой ответ о том, как решить эту проблему. :/

ответ

1

Вы пытаетесь передать указатель на функцию-член. Он нуждается в указателе на функцию, не являющуюся членом. Вам нужно написать функцию, которая делает то, что вам нужно, но не как член класса.

По крайней мере, если память используется, если вы просто хотите, чтобы данные, записанные в файл, указанный в вашем вызове, были указаны с CURLOPT_WRITEDATA, вам не нужно использовать CURLOPT_WRITEFUNCTION - функция по умолчанию будет просто записывать данные в файл, который вы передаете.

Я полагаю, что я должен также упомянуть, что (на основании упоминания экземпляра делегата в сообщении об ошибке) вы, похоже, используете C++/CLI вместо реального C++. Если это так, почти все остальное, вероятно, открыто, по крайней мере, для небольшого вопроса - C++/CLI в некоторой степени похож на C++, но достаточно других, чтобы вызвать проблемы на регулярной основе.

+0

Должно ли быть достаточно, чтобы метод 'write_data' был статическим членом? – harper

+0

@harper: при нормальном C++, да, наверное. В C++/CLI я менее уверен. –