Вот чего я пытаюсь добиться:
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 '::'
Я могу ошибаться с синтаксисом указатель на член … но я также боюсь, что я не могу определить шаблон таким образом … у вас есть идеи?
Ты хочешь void (T::*pMemberFunction)(void)
Другая проблема, вероятно, является просто опечаткой в вашем примере использования, но вызов функции-члена использует .*
как единый оператор; ты не можешь иметь (
между ними или даже пробелами. Я предполагаю, что это опечатка, потому что это почти правильный способ справиться со странным приоритетом оператора, который имеют операторы указатель на член:
(t.*pMemberFunction)();
В вашем коде есть несколько проблем. В частности, синтаксис объявления указателя на функцию-член 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
}
};