2013-11-01 5 views
1
struct AAA { 
    char* myTraceProc(ClientData clientData, Tcl_Interp* interp, const char* name1, const char* name2, int flags) { 
     return NULL; 
    } 
}; 

int main(int argc, char* argv[]) { 
    Tcl_FindExecutable(argv[0]); 
    Tcl_Interp* interp = Tcl_CreateInterp(); 

    AAA obj; 
    boost::function<char*(ClientData, Tcl_Interp*, const char*, const char*, int)> f = boost::bind(&AAA::myTraceProc, &obj, _1, _2, _3, _4, _5); 

    Tcl_TraceVar(interp, "database", TCL_TRACE_WRITES, f, 0); 

    return 0; 
} 

В этом коде я попытался передать AAA::myTraceProc в Tcl_TraceVar, которая принимает указатель на функцию с тем же интерфейсом, как это, но я получаю эту ошибку.Передача функции члена с помощью подталкивание :: связать

error: cannot convert boost::function to char* ()(void, Tcl_Interp*, const char*, const char*, int) for argument 4 to int Tcl_TraceVar(Tcl_Interp*, const char*, int, char* ()(void, Tcl_Interp*, const char*, const char*, int), void*)

Я думаю, что что-то не так со связующей частью. Не могли бы вы исправить это?

ответ

3

Ошибка сообщает вам, что именно не так: вы не можете преобразовать boost::function в простой указатель на функцию. Вам нужно будет написать функцию, не являющуюся членом, и передать указатель на это; он может вызывать функцию-член на объекте, если вы передаете указатель на этот объект в качестве данных клиента.

+0

Спасибо. Это сработало. Первый раз используется ClientData :) – Ashot

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