2015-02-05 3 views
2

У меня есть следующая функцияC++ передавая указатель на функцию

static void p(){ 

} 

Я хочу передать указатель на функцию к р в функции х.

void x(void * ptr){ 

} 

Я стараюсь следующее, и оно не работает.

... 
x(ptr); 

Примечание x и p находятся в разных классах. Я получаю следующую компиляционную ошибку.

invalid conversion from 'void (*)()' to 'void*' [-fpermissive] 
+0

'void *' предназначен для указателей DATA, а не для указателей на функции! Они могут быть даже не одного размера. –

+0

'for (int i = 0; i nbro

ответ

3

Это должно быть:

void x(void(*function)()) 
{ 
    // Whatever... 
} 

Если вы используете C++ 11 вы можете std::function:

void x(std::function<void()> function) 
{ 
    // Whatever 
} 
+0

'std :: function' следует зарезервировать для хранения функциональных функций с стиранием шрифта. Для передачи параметров предпочтительными являются шаблоны. – Quentin

+0

@Quentin - есть ли у вас цитата, почему это так? – Sean

+0

[Этот вопрос и ответы] (http://stackoverflow.com/questions/14677997/stdfunction-vs-template) охватывают его. 'std :: function' - объект с стиранием типа, и это происходит по цене косвенного и динамического распределения, поскольку ничего не известно о pointee. Передача любого функционала с его типом, идеально выведенным параметром шаблона, может быть полностью встроена и оптимизирована. – Quentin

1

Ответ заключается в сообщении об ошибке. void* не является указателем на функцию, void(*)() (например) есть. Вы должны переписать x следующим образом:

void x(void (*ptr)()) { 

} 

Указатель к функции записывается следующим образом:

Ret (*name)(Params) 

Где

  • Ret является в pointee в возвращаемый тип
  • name является название указателя
  • Params - это список параметров плацдарма, как вы могли бы написать их в своем объявлении.

Пример:

double (*ptr)(int, float) 

... может указывать на функцию, принимающую в int и float и возвращающей double.

4

Вам необходимо научиться читать сообщения об ошибках.

недействителен преобразование из 'void (*)()' в 'void*' [-fpermissive]

Это означает, что void* (указатель данные) тип, указанный в x,
но вы передаете void (*)() (a указатель функции).

Так просто изменить x к

void x(void (*ptr)()) 
{ 
} 
1

void* не указатель на функцию, это пустой указатель.

Чтобы объявить указатель функции, используйте void (*ptr)().

+0

с использованием «void (* ptr)()» не работал, пришлось использовать «void (* ptr)», как было предложено @Sean –

+0

@ DisplayName101 Я не понимаю. @Sean предлагает 'void (*)()' также. – emlai

1

Мы можем сделать некоторые уродливые магии указатель, например:

static void function1(char* c) { 
    printf("%s", c); 
} 

void function2(void* ptr) { 
    void(* func)(char*) = (void(*)(char*))ptr; 
    func("a"); 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    void* f = function1; 
    function2(f); 
    return 0; 
} 

Это плохо, но он работает в таких ситуациях.

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