1

这就是我试图实现的目标:

class MyClass
{
    public:
    template<typename T>
    void whenEntering( const std::string& strState, 
                       T& t, 
                       void T::(*pMemberFunction)(void)) /// compilation fails here
    {
        t.(*pMemberFunction)(); // this line is only an example
    }
}

它是一种回调系统,用于对我收到的某些事件做出反应。

但是 Visual 2010 给了我以下编译错误:

    error C2589: '(' : illegal token on right side of '::'

我可能对指向成员的语法有误...但我也担心我可能不会以这种方式定义模板...您有什么想法吗?

4

2 回答 2

6

你要void (T::*pMemberFunction)(void)

另一个问题可能只是您的示例用法中的拼写错误,但调用成员函数.*用作单个运算符;你不能(在它们之间有一个中间,甚至是空白。我猜这是一个错字,因为它几乎是处理指向成员运算符的奇怪运算符优先级的正确方法:

(t.*pMemberFunction)();
于 2013-01-16T17:56:47.363 回答
1

您的代码中有几个问题。特别是,声明指向成员函数的指针的语法是void (T::* pMemberFunction)(void)

总的来说,你的代码应该是这样的:

class MyClass
{
    public:
    template<typename T>
    void whenEntering( const std::string& strState,
                       T& t,
                       void (T::* pMemberFunction)(void)
                               ) /// this fails
    {
        t.*pMemberFunction(); // this line is only an example
    }
};
于 2013-01-16T17:58:18.513 回答