我知道还有很多其他类似的问题,但我看过的问题似乎都不适用于我正在做的事情。我所拥有的主要内容是:
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);
它有效,但语法更可怕。我只是想知道为什么编译器可以推断出类的成员函数的类型,但不能推断出函数的类型。