使用成员函数作为模板参数时的c++编译错误

标签 c++ templates generic-programming pointer-to-member

我正在尝试将成员函数指针作为模板参数传递。这是代码:

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 是一个运行时变量。另一方面,之前的代码摘录编译:

http://ideone.com/cv8pq

那么……这样对吗?它取决于编译器吗?

最佳答案

mptr 是一个运行时变量 - 您不能将其作为模板参数提供。检查http://ideone.com/CIL4C .

编辑

奇怪的是http://ideone.com/cv8pq与您的代码类似的东西可以成功编译和运行。

关于使用成员函数作为模板参数时的c++编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9693911/

相关文章:

c++ - 对参数包中的每个元素应用函数

c++ - std::enable_if 和 std::enable_if_t 有什么区别?

c++ - std::merge 不适用于 std::async

c++ - 我怎么知道我使用的是复制还是 move ?

c++ - 纯虚函数可以作为Variadic函数模板吗?

C++如何在泛型编程中声明一个自定义数组

haskell - 我可以使用 `Traversal` 获取存储在分支中的项目的 `Control.Lens.Plated` 吗?

terminology - "refinement"的逆概念是什么

c++ - Linux BTF : bpftool: Failed to get EHDR from/sys/kernel/btf/vmlinux

c++ - OpenGL实际上是如何读取索引的?