假设我们有以下函数定义
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个小时试图谷歌解决方案,无济于事(不,这不是成员函数问题,只涉及独立功能)。
我做错了什么?
答案 0 :(得分:2)
必须在编译时确定任何模板参数。在register_function
中,在运行时调用函数之前,函数指针f
的值是未知的。
答案 1 :(得分:0)
这段代码编译得很好,我得到一个错误“function_wrapper_dummy”必须返回一个值。我不认为这个代码有错误。