2012-03-29 4 views
1

Я программист на C (на linux), но теперь у меня есть проект на C++, и у меня есть вопрос.Ошибка: преобразование из 'void (FlashWork :: *) (int, siginfo_t *, void *)' to 'void * (*) (int, siginfo_t *, void *)'

Вот пример кода

g_action.sa_sigaction = (void(*)(int,siginfo_t*,void*))&FlashWork::Disconnect_action; 

Когда я пытаюсь скомпилировать это x86, он отлично работает, но на руке я получаю следующее сообщение об ошибке

error: converting from void (FlashWork::*)(int, siginfo_t*, void*) to void (*)(int, siginfo_t*, void*)

Что я делаю неправильно?

+0

Сообщение об ошибке в заголовке не соответствует коду и сообщению об ошибке в тексте вопроса. Заголовок имеет дополнительный '*' в возвращаемом типе типа назначения 'void *', а не 'void'. Тело вопроса - это правильный тип функции для sigaction. –

ответ

3

«Указатель на элементы» несовместим с «указателями на функции», если только он не является членом static. Причина в том, что указатель на элемент нуждается в объекте (объект FlashWork) в вашем случае.

+1

Фактически, даже если это 'static', у него все еще не будет' 'extern 'C'' связи, требуемой для sa_sigation. Большинство реализаций позволяют это, но это не предусмотрено. – Flexo

+0

@awoodland, не 'extern 'C", связанный с именем-mangling? Как это проблема с указателями функций (в которых у вас есть адрес функции, а не имя больше) – Shahbaz

+0

@Shahbaz: Теоретически, это также может повлиять на соглашения о вызовах, и это рассматривается в разрешении перегрузки. Именно поэтому C++ определяет две перегрузки 'qsort'. – MSalters

1

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

1

Помимо того, возвращаемое значение функции различны, вы должны знать, что в C++, когда у вас есть функция-член (который не является статическим):

void (FlashWork::*)(int, siginfo_t*, void*) 

Реальная подписи (один с программист любит видеть) это:

void (*)(FlashWork *, int, siginfo_t *, void *) 

этот параметр FlashWork * скрытый указатель, который может быть назван по this.

Поэтому

void (FlashWork::*)(int, siginfo_t*, void*) 

и

void (*)(int, siginfo_t*, void*) 

имеют различное количество аргументов.

+0

thanxx полезный inf !!! – evghin

+0

Ввод «дополнительного параметра» сначала может ввести в заблуждение. Вы не можете преобразовать '& FlashWork :: Disconnnect_action' в' void (*) (FlashWork *, int, siginfo_t *, void *) ', так что это не настоящая сигнатура. В любой заданной реализации вызывающее соглашение для функций-членов может выглядеть или не выглядеть так, как если бы они были свободными функциями с 'this', переданными в качестве первого параметра. –

+0

@SteveJessop, правый.Я просто хотел указать, что 'this' также является параметром. Я всегда думал, что это будет первый параметр. Хорошо знать. – Shahbaz

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