1

我知道还有很多其他类似的问题,但我看过的问题似乎都不适用于我正在做的事情。我所拥有的主要内容是:

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);

它有效,但语法更可怕。我只是想知道为什么编译器可以推断出类的成员函数的类型,但不能推断出函数的类型。

4

1 回答 1

0

因此,这里似乎发生了一些事情。首先,调用约定是错误的,PMF中应该有a __cdecl。其次,这样做之后,问题仍然存在。这是 Visual Studio VC++ 编译器中已确认的错误

于 2013-06-20T07:40:02.947 回答