0

假设我们有以下函数定义

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 个小时尝试 google 解决方案,但无济于事(不,这不是成员函数问题,只涉及独立函数)。

我究竟做错了什么?

4

2 回答 2

2

任何模板参数都必须在编译时确定。在中,直到在运行时调用函数才知道register_function函数指针的值。f

于 2013-09-09T13:32:58.500 回答
0

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

于 2013-09-09T13:37:04.823 回答