2012-03-13 14 views
1

メンバ関数ポインタをテンプレートパラメータとして渡そうとしています。ここでは、コードです:メンバ関数をテンプレートパラメータとして使用するとコンパイルエラーが発生する

template <typename Ret, typename T, Ret(T::*mptr)()> 
Handle<Value> get_value (Local<String> name, const AccessorInfo& info) 
{ 
    ... 
} 

template <typename Ret, typename T> 
void mbind (const char* name, Ret (T::*mptr)()) 
{ 
    .... 
    objectTemplate->SetAccessor (String::NewSymbol (name),get_value<Ret,T,mptr>); 
} 

そして、これは私が取得していますエラーです:私の知る限りは、メンバ関数へのポインタが有効なテンプレートパラメータを知っているよう

wrapper.h:184:5: error: ‘mptr’ is not a valid template argument for type ‘int (Cell::*)()’ 
wrapper.h:184:5: error: it must be a pointer-to-member of the form `&X::Y' 
... 

。前のコードで何が間違っているのか分かりません。私が使用しているコンパイラは、Ubuntuでg ++ 4.5.2です。

ありがとうございます。

UPDATE:

mptrは、ランタイム変数であるようなコードが間違っていなければなりません思われます。一方、前のコードの抜粋は、コンパイルされます。

http://ideone.com/cv8pq

ので...それは正しいのですか?それはコンパイラに依存しますか?

答えて

4

mptrはランタイム変数です。テンプレートパラメータとして与えることはできません。チェックhttp://ideone.com/CIL4Cを確認してください。

編集

奇妙なことは、あなたのコードに似た何かが正常にコンパイルして動作しますhttp://ideone.com/cv8pqです。

template <typename Ret, typename T, Ret (T::*mptr)()> 
void mbind (const char* name) { 
    objectTemplate->SetAccessor (String::NewSymbol (name),get_value<Ret,T,mptr>()); 
} 

PS:

+0

ありがとうございました。メンバ関数へのポインタを 'mbind()'のテンプレートパラメータとして追加しています。 'mbind (" getWidth ");' これで 'mbind()'の呼び出しをもっと簡単にする方法があるかと思います。これらのテンプレート引数をすべて指定する必要はありません。 ありがとう! – user1192525

+0

so ...有効かどうかはわかりませんが(一部のコンパイラでのみサポートされています)、d – user1192525

1

mbindは、既にテンプレート引数を取る必要がありますget_value<>()を忘れてしまいました。