我正在尝试将成员函数指针作为模板参数传递。这是代码:
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。
提前致谢。
更新
似乎代码应该是错误的,因为mptr
是运行时变量。另一方面,之前的代码摘录编译:
所以......这是正确的吗?它取决于编译器吗?
答案 0 :(得分:4)
mptr
是一个运行时变量 - 您不能将其作为模板参数提供。检查http://ideone.com/CIL4C。
修改强>
奇怪的是http://ideone.com/cv8pq,其中类似于您的代码的内容成功编译并运行。
答案 1 :(得分:1)
mbind
应该已经采用模板参数:
template <typename Ret, typename T, Ret (T::*mptr)()>
void mbind (const char* name) {
objectTemplate->SetAccessor (String::NewSymbol (name),get_value<Ret,T,mptr>());
}
PS:您在()
之后忘记了get_value<>
。