次の関数定義があると仮定します
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時間費やしましたが、役に立ちませんでした(いいえ、これはメンバー関数の問題ではなく、独立した関数のみが関係しています)。
私は何を間違っていますか?