1

По какому-тому причиню пытается передать указатель на эту функцию к varadic функции выдает следующую ошибку:C++ Функции Pointer вопрос

1>c:\... : error C2664: 'PyArg_ParseTuple' : cannot convert parameter 3 from 'int (__cdecl *)(PyObject *,void *)' to '...' 
1>  Context does not allow for disambiguation of overloaded function 

PyArg_ParseTuple(args, "O&O&:CreateWindow", 
    &Arg_Size2U<1>, &size, 
    &Arg_String<2>, &title); 

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

Есть ли какой-то путь вокруг этого, который не требует создания множества версий для каждой функции преобразования аргументов, но все еще может содержать номер аргумента в исключении, если есть ошибка? (Еще лучше передать номер аргумента в качестве пареметра, поэтому в моей DLL нет нескольких копий функции.)

EDIT: Это также приводит к ошибкам компиляции. Невозможно создать указатель на функцию шаблона или мне нужно сделать это от обычных функций?

int (*sizeConv)(PyObject *,void *) = Arg_MakeSize2U<1>; 
1>c:\... : error C2440: 'initializing' : cannot convert from 'int (__cdecl *)(PyObject *,void *)' to 'int (__cdecl *)(PyObject *,void *)' 
1>  None of the functions with this name in scope match the target type 

функция объявлена ​​как:

template<int ARG> int Arg_MakeSize2U(PyObject *obj, void *out) 

EDIT2: добавив адрес оператора дал еще одну ошибку diffrent ...

int (*sizeConv)(PyObject *,void *) = &Arg_MakeSize2U<1>; 

1>c:\... : error C2440: 'initializing' : cannot convert from 'overloaded-function' to 'int (__cdecl *)(PyObject *,void *)' 
1>  None of the functions with this name in scope match the target type 
+0

Какое определение Arg_Size2U? –

+0

Поскольку это похоже на Python/Swig, вы должны предоставить больше контекста. –

+0

Актуален, хотя я столкнулся с ним с помощью python C-APi, дальнейшие тесты показывают, что это происходит с параметрами функции varaidc и функциями шаблона в целом. Также просто попытка создания указателя функции создает ошибку, хотя и отличается от ... –

ответ

0

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

+0

Да, однако этот заголовок включен в предварительно скомпилированный заголовок, может ли это вызвать проблему под VS2008? –

+0

Я включил заголовок непосредственно в cpp, где у меня была своя, исключая те же ошибки. –

+0

Я имел в виду, что тело шаблона должно быть в заголовке. Если это не так, можно объяснить вторую ошибку. template void myFunc (T arg) { 10 arg + 1; } – Budric

2

Это нормально компилируется в VC++ 2008:

struct PyObject; 

template<int ARG> int Arg_MakeSize2U(PyObject *obj, void *out) 
{ 
    return 0; 
} 

int main() 
{ 
    int (*sizeConv)(PyObject *,void *) = &Arg_MakeSize2U<1>; 
    sizeConv(0, 0); 
} 

Так что вы должны делать что-то по-другому. Может быть, у вас перегрузка, и вы ее не заметили. Проведение большего контекста поможет лучше диагностировать проблему.