Я получаю ошибку компиляции (MS VS 2008), которую я просто не понимаю. После долгих разговора с ним все расплывчато, и я чувствую, что есть что-то очень очевидное (и очень глупое), что мне не хватает. Вот существенный код:Как вызвать функцию-указатель-член?
typedef int (C::*PFN)(int);
struct MAP_ENTRY
{
int id;
PFN pfn;
};
class C
{
...
int Dispatch(int, int);
MAP_ENTRY *pMap;
...
};
int C::Dispatch(int id, int val)
{
for (MAP_ENTRY *p = pMap; p->id != 0; ++p)
{
if (p->id == id)
return p->pfn(val); // <--- error here
}
return 0;
}
Иски компилятор на стрелочку, что «термин не оценить на функцию, принимающую 1 аргумент». Почему нет? PFN прототипируется как функция с одним аргументом, а MAP_ENTRY.pfn является PFN. Что мне здесь не хватает?
Синтаксис C является ржавым, поэтому не добавляя в качестве ответа, если он не будет «return (* (p-> pfn)) (val);»? - –
Нет, это приводит к ошибке «* незаконна в операндах типа C :: PFN». – chrisd
Возможный дубликат [Вызов методов класса C++ с помощью указателя функции] (http://stackoverflow.com/questions/1485983/calling-c-class-methods-via-a-function-pointer) –