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時間費やしましたが、役に立ちませんでした(いいえ、これはメンバー関数の問題ではなく、独立した関数のみが関係しています)。

私は何を間違っていますか?

4

2 に答える 2