Estoy intentando escribir una función de devolución de llamada de plantilla para libcurl. Sin embargo, cuando se utiliza un puntero a una instancia de la función de plantilla, VC++ 2008 y 2010 keep me da este error:Error de VC++ al usar un puntero a una función de plantilla
template-callback.cpp(27) : error C2664: 'curl_easy_setopt' : cannot convert parameter 3 from 'size_t (__cdecl *)(void *,size_t,size_t,void *)' to '...' Context does not allow for disambiguation of overloaded function
Pero GCC (4.5.1) compila el código sin ningún problema. Esta es una versión recortada del código:
#include <string>
template<typename String>
size_t callback(
void* ptr
, size_t size
, size_t nmemb
, void* userdata
)
{
//String* str = static_cast<String*>(userdata);
size_t len = size*nmemb;
//str->append(static_cast<char const*>(ptr), len);
return len;
}
typedef size_t (*write_callback)(void*, size_t, size_t, void*);
struct CURL;
enum CURLOption { none };
void curl_easy_setopt(CURL*, CURLOption, ...);
void f()
{
CURL* curl = NULL;
CURLOption option = none;
// This gives an error
curl_easy_setopt(curl, option, &callback<std::string>);
// This doesn't
write_callback cb = &callback<std::string>;
curl_easy_setopt(curl, option, cb);
}
Es esto un error en VC++ o estoy haciendo algo mal?
@Pablo: ¿es esta la firma exacta de 'curl_easy_setopt'? Me pregunto si el problema no proviene del argumento variado. –
@ Matthieu: El problema proviene del argumento variadico. – Xeo
@Xeo: ¿tienes alguna idea de por qué, gcc-4.3.4 también rechaza el código, pero gcc-4.5.1 lo acepta en modo C++ 0x. No uso argumentos variados en general, así que estoy un poco perdido en cuanto al origen del problema:/ –