Указатель на синтаксис функции-члена при объявлении шаблона

Вот чего я пытаюсь добиться:

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

Я могу ошибаться с синтаксисом указатель на член … но я также боюсь, что я не могу определить шаблон таким образом … у вас есть идеи?

1

Решение

Ты хочешь void (T::*pMemberFunction)(void)

Другая проблема, вероятно, является просто опечаткой в ​​вашем примере использования, но вызов функции-члена использует .* как единый оператор; ты не можешь иметь ( между ними или даже пробелами. Я предполагаю, что это опечатка, потому что это почти правильный способ справиться со странным приоритетом оператора, который имеют операторы указатель на член:

(t.*pMemberFunction)();
6

Другие решения

В вашем коде есть несколько проблем. В частности, синтаксис объявления указателя на функцию-член 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
}
};
1

По вопросам рекламы [email protected]