我知道还有很多其他类似的问题,但我所看到的那些问题似乎都不适用于我正在做的事情。我所拥有的主旨是:
template <typename T>
void CallFn(T *p, void (T::*pfn)(void))
{
(p->*pfn)();
}
使用:
调用class Foo
{
public:
void Bar(void);
}
...
Foo *p = ...
CallFn(p, &Foo::Bar);
但是这给了我一个错误,说编译器不能推导出指向成员函数的指针的模板参数。如果我改为使用这样的结构:
template <typename T>
class Wrapper
{
public:
void operator()(T *p, void (T::*pfn)(void))
{
(p->*pfn)();
}
};
...
Foo *p = ...
Wrapper<Foo> x;
x(p, &Foo::Bar);
它有效,但语法更加可怕。我只是想知道为什么编译器可以推断出类的成员函数的类型,而不是函数。
答案 0 :(得分:0)
所以,这里似乎有一些事情发生。首先,调用约定是错误的,PMF中应该有__cdecl
。其次,在这样做之后,问题仍然存在。这是Visual Studio VC ++编译器中确认的错误