假设我们有以下函数定义
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 解决方案,但无济于事(不,这不是成员函数问题,只涉及独立函数)。
我究竟做错了什么?