声明模板时指向成员函数语法的指针

时间:2013-01-16 17:53:48

标签: c++ templates member-function-pointers

这是我努力实现的目标:

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 '::'

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

2 个答案:

答案 0 :(得分:6)

您想要void (T::*pMemberFunction)(void)

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

(t.*pMemberFunction)();

答案 1 :(得分: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
    }
};