Я воспроизвел проблему на ideone (C ++ 03 с gcc-4.3.4):
#include <iostream>
typedef void (*FuncType)(int);
void foo(FuncType);
void bar(...);
template <typename T>
void callback(T t) { std::cout << t << "\n"; }
int main() {
foo(&callback<int>); // OK
bar(static_cast<FuncType>(&callback<int>)); // OK
bar(&callback<int>); // error: address of overloaded function
// with no contextual type information
}
Похоже, что проблема возникает из-за взаимодействия аргумента variadic и указателя функции.
Примечание: в режиме C ++ 0x с gcc-4.5.1 работает нормально
Я предполагаю, что проблема связана с разрешением перегрузки bar
(или curl_easy_setopt
в вашем случае).
Проблема в том, что для использования многоточия компилятор решает, как передать аргумент: int
, double
, pointer
, ... Кажется, что он не может решить, сам, что тип &callback<int>
.
Когда мы используем foo
или выполняем приведение, это однозначно, потому что выбора нет.
Я подозреваю, что проблема с конвертацией, но у меня нет версии стандарта C ++ 03, которую можно было бы изучить.