Проблема с указателем на функцию C ++ - PullRequest
1 голос
/ 08 мая 2009

По какой-то причине попытка передать указатель на эту функцию в произвольную функцию приводит к следующей ошибке:

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: добавление адреса оператора дало еще одну различную ошибку ...

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

Ответы [ 2 ]

2 голосов
/ 08 мая 2009

Это прекрасно компилируется в 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);
}

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

0 голосов
/ 08 мая 2009

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

...