C ++函数指针问题

时间:2009-05-08 14:16:23

标签: c++ templates function-pointers variadic-functions function-templates

由于某种原因,尝试将指向此函数的指针传递给varadic函数会产生以下错误:

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中没有多个函数副本。)

编辑: 这似乎也导致编译错误。有没有办法创建一个模板函数的函数指针,还是我需要从普通函数中做出差异?

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 个答案:

答案 0 :(得分: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);
}

所以你必须采取不同的做法。也许你确实有一个超载,你没有注意到。发布更多上下文有助于更好地诊断问题。

答案 1 :(得分:0)

从第二个错误看起来,编译器无法找到实现。您的模板函数定义是在声明模板的头文件中吗?