这是我努力实现的目标:
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 '::'
我可能错误的指向成员语法......但我也担心我可能不会以这种方式定义模板......你有什么想法吗?
答案 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
}
};