模板化函数的函数指针

时间:2013-09-09 13:26:01

标签: c++ templates function-pointers

假设我们有以下函数定义

int function_wrapper_dummy( lua_State* ) { }

template < typename F, F* f > 
int function_wrapper( lua_State* L ) { }

以下功能

template < typename F >
void register_function( F f )
{
    int (*lf) (lua_State *L) = function_wrapper_dummy;   // line 1
    int (*lf) (lua_State *L) = function_wrapper< F, f >; // line 2
}

编译上面的代码适用于第1行,但不适用于第2行。

非常幽默,VS2012告诉我们:

error C2440: 'initializing' : cannot convert from 'int (__cdecl *)(lua_State *)' 
to 'int (__cdecl *)(lua_State *)'

虽然Clang 3.3发出:

error: address of overloaded function
'function_wrapper' does not match required type 'int (lua_State *)'
...int (*lf) (lua_State *) = function_wrapper< F, f >;

我在不太复杂的情况下使用模板化函数地址,所以我看到它可以完成。我检查了lua_State是相同的lua_State,我检查了调用约定,并且我检查了名称阴影。我也花了2个小时试图谷歌解决方案,无济于事(不,这不是成员函数问题,只涉及独立功能)。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

必须在编译时确定任何模板参数。在register_function中,在运行时调用函数之前,函数指针f的值是未知的。

答案 1 :(得分:0)

这段代码编译得很好,我得到一个错误“function_wrapper_dummy”必须返回一个值。我不认为这个代码有错误。