2016-10-31 3 views
0

Допустим, у меня есть следующие определения:C++ указатель на функцию-член не указатель функции

class ScriptInterpreter { 
public: 
class cell; 
typedef ScriptInterpreter::cell (ScriptInterpreter::*proc_t) (const std::vector<cell> &); 

class cell { 
public: 
    proc_t proc; 
}; 

ScriptInterpreter::cell proc_add(const std::vector<cell> & c); 
}; 

и следующий код происходит:

ScriptInterpreter::eval(ScriptInterpreter::cell cell, environment * env) 
{ 
// ... 

ScriptInterpreter::cell c; 
c.proc = &ScriptInterpreter::proc_add; 

return (c.*proc_)(exps); 
} 

На линии, где я пытаюсь вызвать указатель функции я получаю ошибку

error: called object type 'proc_t' (aka 'ScriptInterpreter::cell (ScriptInterpreter::*)(const std::vector<cell> &)') is not 
    a function or function pointer 

Когда я добавить * в передней части FUNC поэтому строка выглядит следующим образом:

ScriptInterpreter::cell c = (proc_cell.*proc_)(exps); 

производит это:

error: use of undeclared identifier 'proc_' 

я уже смотрел на Callback functions in c++ и другие проблемы такого рода, но на самом деле ничего не дал мне намек, что это неправильно или представило никакой информации о моей ошибке. Я определенно не имею никаких имен дважды или что-то в этом роде. Также после прочтения what is an undeclared identifier error and how do i fix it Я уверен, что у меня все в порядке.

Так что я делаю неправильно?

Edit: обновленный код с реальным кодом вместо кода заполнителя

+1

Во-первых, в вашем коде нет 'B'. Только «A :: B». Лучше публиковать реальный код для вашего 'main', чтобы люди поняли, о чем вы говорите. – AnT

+0

Вам нужен объект 'A' (не' B'), чтобы вызвать его, поскольку он является указателем на функцию члена 'A'. – songyuanyao

+0

B не относится к A – Raindrop7

ответ

0

Для вызова функции-члена через указатель указатель на член типа, вы должны использовать либо оператор .* или оператор ->*. А с левой стороны вы должны указать объект, для которого вы хотите вызвать эту функцию-член.

В вашем случае попытка сделать это может выглядеть следующим образом

A::B b_object; 
b_object.func = &A::func_to_call; 

A a_object; 
A::B other_b_object = (a_object.*b_object.func)(); 

Обратите внимание, что, так как указатель объявлен как указывающие на член A, оператору .* нужен объект типа A слева - сторона стороны.

Однако в вашем конкретном случае это плохо сформировано, так как b_object.func является закрытым и недоступным с main.

P.S. int main, а не void main.

Смежные вопросы