我正在嘗試爲libcurl編寫模板回調函數。但是,使用指針模板函數的一個實例,VC++ 2008和2010年繼續給我這個錯誤時:使用指向模板函數的指針時出現VC++錯誤
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
但是GCC(4.5.1)編譯沒有問題的代碼。這是一個修剪版本的代碼:
#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);
}
這是VC++中的錯誤還是我做錯了什麼?
@Pablo:這是'curl_easy_setopt'的確切簽名嗎?我想知道這個問題是不是來自可變參數。 – 2011-05-27 09:18:00
@Matthieu:問題確實來自可變參數。 – Xeo 2011-05-27 09:21:40
@Xeo:你有什麼想法爲什麼,gcc-4.3.4也會拒絕代碼,但gcc-4.5.1在C++ 0x模式下接受它。我一般不會使用可變參數,所以我對這個問題的起源有點遺憾:/ – 2011-05-27 09:30:20