2014-01-27 3 views
-1

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

static struct thread { 
    const char *const filename; 
    ssize_t (*in)(struct thread *, void *, size_t); 

} 

и функции

int MyClass::read_wrap(struct stThread *t, void *buf, size_t nbytes) 
{ 
    return read(t->fd, buf, nbytes); 
} 

Я стараюсь, чтобы назначить функцию read_wrap для элемент указателя функции в объекте struct:

int main (void) 
{ 

thread myThread; 
myThread.in = read_wrap; 

} 

Но я получаю t он ошибка:

error: cannot convert MyClass::read_wrap’ from type ‘int (MyClass::)(stThread*, void*, size_t) {aka int (MyClass::)(stThread*, void*, unsigned int)}’ to type ‘int (*)(MyClass*, void*, size_t) {aka int (*)(stThread*, void*, unsigned int)}’ 

Я имею в виду, структура ожидает указатель на функцию, и я думал, когда я передать его имя функции, что это как-то отливают в FP ?! Этот код является C и скомпилирован с gcc. Спасибо за помощь!

+0

Т-> FD функция типа функции, это отличается только за указатель на функцию типа – zapredelom

ответ

1

Указатели функции функций имеют разные типы для обычных указателей функций. Как вы можете видеть из ошибок, тип функции члена указатель на read_wrap на самом деле:

int (MyClass::*)(stThread*, void*, size_t) 

Важной частью является MyClass::, что делает его несовместимым с нормальной функцией указателя. Этот указатель на функцию-член должен вызываться в некотором экземпляре MyClass.

Однако, поскольку ваша функция read_wrap даже не использует какие-либо нестатические элементы MyClass, нет никакой причины иметь ее как функцию нестатического члена. Либо сделайте его свободной функцией, либо сделайте ее статическим членом, и ваша ошибка исчезнет.

0

Вы инициализируете несвязанную функцию ordinary function указатель (type ‘int (*)(MyClass*, void*, size_t) {aka int (*)(stThread*, void*, unsigned int)}’) с нестационарным адресом функции функции (type ‘int (MyClass::)(stThread*, void*, size_t) {aka int (MyClass::)(stThread*, void*, unsigned int)}’). Тип объявления должен быть изменен в соответствии с вашим инициализированным значением.

Попробуйте изменить

ssize_t (*in)(struct thread *, void *, size_t); 

Для

ssize_t (MyClass::*in)(struct thread *, void *, size_t); 
+0

Если вы сделаете это изменение, вы будете также необходимо каким-то образом предоставить объект MyClass для вызова функции-члена. Поскольку функция не имеет доступа к каким-либо членам класса, что делает ее статической или не-членом, вероятно, является лучшим вариантом. –

+0

@MikeSeymour: Я считаю, что вопрос OP - это просто урезанная версия более крупной проблемы. Поэтому, предполагая, что функция не имеет доступа к каким-либо членам класса, может быть неверной. Но в любом случае пусть у нас есть выбор с ОП на основе использования. И да, вы упомянули проблему дизайна. Если функция достаточно тривиальна, что она не имеет доступа к каким-либо членам класса, она должна быть не членной функцией. Часть указателя функции вопроса возникает гораздо позже в сценарии. Пожалуйста, дайте мне знать, если вы думаете иначе. – Abhijit

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