Есть сторонняя библиотека, из нее пользуется функция, котороя одним из параметров принимает указатель на функцию (судя по всему 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
Возможно побороть? Или нужно по любому свободную функцию передавать?
Здравствуйте, Тим, Вы писали:
Тим>Есть сторонняя библиотека, из нее пользуется функция, котороя одним из параметров принимает указатель на функцию (судя по всему 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, можно попробовать передать статический метод класса.
Здравствуйте, Тим, Вы писали:
Тим>Есть сторонняя библиотека, из нее пользуется функция, котороя одним из параметров принимает указатель на функцию (судя по всему 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. Кусок кода, как ты передаёшь
Здравствуйте, 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);
...
}
};
Здравствуйте, 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, можно попробовать передать статический метод класса.
Статический метод проглотил. Спасибо.
Здравствуйте, Тим, Вы писали:
Тим>Здравствуйте, 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 может передаваться через регистр, а не на стеке).