【发布时间】:2011-09-03 05:59:21
【问题描述】:
我正在尝试为 libcurl 编写一个模板回调函数。但是,当使用指向模板函数实例的指针时,VC++ 2008 和 2010 不断给我这个错误:
模板回调.cpp(27):错误 C2664:'curl_easy_setopt':不能 从 'size_t 转换参数 3 (__cdecl *)(void *,size_t,size_t,void *)' 到 '...' 上下文不允许消除重载函数的歧义
但是 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的确切签名吗?我想知道问题是否不是来自可变参数。 -
@Matthieu:问题确实来自可变参数。
-
@Xeo:你知道为什么,gcc-4.3.4 也拒绝代码,但 gcc-4.5.1 在 C++0x 模式下接受它。我一般不使用可变参数,所以我对问题的根源有点茫然:/
-
@Matthieu:对不起,不知道。 ://
-
@Matthieu M. 这几乎是完全一致的签名,除了被修剪以使其在没有依赖关系的情况下编译。
标签: c++ templates visual-c++ function-pointers