Я использую визуальную студию 2012 профессионала, у меня есть журнал классов:
class log
{
//some code
private:
int check();
};
и в другом классе у меня есть указатель на функцию, подобную этой в конструкторе:
class fun
{
//some code
public:
fun(int (*wsk)());
}
и когда я пытаюсь отправить функцию проверки из журнала классов в конструктор fun, я получаю ошибку:
typedef int (*fwsk)();
fwsk gwsk = check;
fwsk gwsk = (void *)check;
Как заставить его работать?
Функции - члены принимают невидимый первый аргумент this
поэтому int log::check
- это указатель на функцию типа:
typedef int (log::*function_pointer_type)(void);
К сожалению, это никогда не будет тем же типом, что и
typedef int (*fwsk)(void);
Вы можете использовать std::bind
в С++ 11, чтобы обойти это и передать общую функцию.
Пример:
typedef std::function<void(int)> fwsk;
class Log
{
public:
int check(){}
};
class fun
{
//some code
public:
fun(const fwsk& wsk){}
};
int main(int argc, char** argv)
{
Log l;
fun f(std::bind(&Log::check,&l));
}