Указатель на функцию в функцию сторонней библиотеки.
От: Тим Россия  
Дата: 22.10.04 08:40
Оценка:
Есть сторонняя библиотека, из нее пользуется функция, котороя одним из параметров принимает указатель на функцию (судя по всему extern "C"). Хочется подсунуть ей метод некоторого класса. Шестая студия ругается примерно так

error C2664: 'SetFunc' : cannot convert parameter 2 from 'int (struct TYPE *,int)' to 'int (__cdecl *)(struct TYPE *,int)'
None of the functions with this name in scope match the target type


Возможно побороть? Или нужно по любому свободную функцию передавать?
Re: Указатель на функцию в функцию сторонней библиотеки.
От: g.kostik  
Дата: 22.10.04 08:46
Оценка: 2 (1)
Здравствуйте, Тим, Вы писали:

Тим>Есть сторонняя библиотека, из нее пользуется функция, котороя одним из параметров принимает указатель на функцию (судя по всему extern "C"). Хочется подсунуть ей метод некоторого класса. Шестая студия ругается примерно так


Тим>

Тим>error C2664: 'SetFunc' : cannot convert parameter 2 from 'int (struct TYPE *,int)' to 'int (__cdecl *)(struct TYPE *,int)'
Тим> None of the functions with this name in scope match the target type


Тим>Возможно побороть? Или нужно по любому свободную функцию передавать?


В методах класса передается неявный пареметр this, можно попробовать передать статический метод класса.
Re: Указатель на функцию в функцию сторонней библиотеки.
От: korzhik Россия  
Дата: 22.10.04 08:48
Оценка:
Здравствуйте, Тим, Вы писали:

Тим>Есть сторонняя библиотека, из нее пользуется функция, котороя одним из параметров принимает указатель на функцию (судя по всему extern "C"). Хочется подсунуть ей метод некоторого класса. Шестая студия ругается примерно так


Тим>

Тим>error C2664: 'SetFunc' : cannot convert parameter 2 from 'int (struct TYPE *,int)' to 'int (__cdecl *)(struct TYPE *,int)'
Тим> None of the functions with this name in scope match the target type


Тим>Возможно побороть? Или нужно по любому свободную функцию передавать?


а можно для начала увидеть следующие вещи:
1. Прототип библиотечной функции
2. Объявление функции которую ты передаёшь
3. Кусок кода, как ты передаёшь
Re[2]: Указатель на функцию в функцию сторонней библиотеки.
От: Тим Россия  
Дата: 22.10.04 09:25
Оценка:
Здравствуйте, korzhik, Вы писали:

K>Здравствуйте, Тим, Вы писали:


Тим>>Есть сторонняя библиотека, из нее пользуется функция, котороя одним из параметров принимает указатель на функцию (судя по всему extern "C"). Хочется подсунуть ей метод некоторого класса. Шестая студия ругается примерно так


Тим>>

Тим>>error C2664: 'SetFunc' : cannot convert parameter 2 from 'int (struct TYPE *,int)' to 'int (__cdecl *)(struct TYPE *,int)'
Тим>> None of the functions with this name in scope match the target type


Тим>>Возможно побороть? Или нужно по любому свободную функцию передавать?


K>а можно для начала увидеть следующие вещи:

K>1. Прототип библиотечной функции
K>2. Объявление функции которую ты передаёшь
K>3. Кусок кода, как ты передаёшь

Объявление:


typedef  int (*callback_t) (TYPE *i, int key) ;  


_EXPORT void SetFunc
(
 TYPE *i,
 callback_t proc,
 const char *Title,    
 void *prm
);


Хочется получить примерно такую конструкцию:

class SomeClass{
  TYPE *t;
  int func(TYPE *t, int key);
public:
  SomeClass(){
    ...
  SetFunc(t, func, _SOMENAMECONST, 0);
    ...
  }
};
Re[2]: Указатель на функцию в функцию сторонней библиотеки.
От: Тим Россия  
Дата: 22.10.04 09:29
Оценка:
Здравствуйте, g.kostik, Вы писали:

GK>Здравствуйте, Тим, Вы писали:


Тим>>Есть сторонняя библиотека, из нее пользуется функция, котороя одним из параметров принимает указатель на функцию (судя по всему extern "C"). Хочется подсунуть ей метод некоторого класса. Шестая студия ругается примерно так


Тим>>

Тим>>error C2664: 'SetFunc' : cannot convert parameter 2 from 'int (struct TYPE *,int)' to 'int (__cdecl *)(struct TYPE *,int)'
Тим>> None of the functions with this name in scope match the target type


Тим>>Возможно побороть? Или нужно по любому свободную функцию передавать?


GK>В методах класса передается неявный пареметр this, можно попробовать передать статический метод класса.


Статический метод проглотил. Спасибо.
Re[3]: Указатель на функцию в функцию сторонней библиотеки.
От: Аноним  
Дата: 22.10.04 09:30
Оценка:
Здравствуйте, Тим, Вы писали:

Тим>Здравствуйте, korzhik, Вы писали:


K>>Здравствуйте, Тим, Вы писали:


Тим>>>Есть сторонняя библиотека, из нее пользуется функция, котороя одним из параметров принимает указатель на функцию (судя по всему extern "C"). Хочется подсунуть ей метод некоторого класса. Шестая студия ругается примерно так


Тим>>>

Тим>>>error C2664: 'SetFunc' : cannot convert parameter 2 from 'int (struct TYPE *,int)' to 'int (__cdecl *)(struct TYPE *,int)'
Тим>>> None of the functions with this name in scope match the target type


Тим>>>Возможно побороть? Или нужно по любому свободную функцию передавать?


K>>а можно для начала увидеть следующие вещи:

K>>1. Прототип библиотечной функции
K>>2. Объявление функции которую ты передаёшь
K>>3. Кусок кода, как ты передаёшь

Тим>Объявление:


Тим>

Тим>typedef  int (*callback_t) (TYPE *i, int key) ;  


Тим>_EXPORT void SetFunc
Тим>(
Тим> TYPE *i,
Тим> callback_t proc,
Тим> const char *Title,    
Тим> void *prm
Тим>);
Тим>


Тим>Хочется получить примерно такую конструкцию:


Тим>
Тим>class SomeClass{
Тим>  TYPE *t;
Тим>  int func(TYPE *t, int key);
Тим>public:
Тим>  SomeClass(){
Тим>    ...
Тим>  SetFunc(t, func, _SOMENAMECONST, 0);
Тим>    ...
Тим>  }
Тим>};
Тим>


Или объяви SomeClass::func как static или используй функцию вне класса. Для функции-члена — не получится, из-за наличия скрытого параметра this:
библиотечная функция требует 2 параметра, а функции члена func, как она у тебя объявлена, их фактически 3: t,key и this. Кроме того, функция-член может использовать иное соглашение о вызове, не совместимое с функцией из сторонней библиотеки (например, this может передаваться через регистр, а не на стеке).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.