Проблема с переопределением std::function [закрыто]

202
15 декабря 2016, 16:10

и снова доброго вечера всем форумчанам. Возникла проблема с переопределением объектов std::function<void()> и будто вещь это не особо сложная, а разобраться никак не получается. есть у меня некоторый класс:

введите код здесь
#include <functional>
class ProcessEventHandler
{
public: 
      std::function<void()> ProcessCrashHandler;
      std::function<void()> ProcessStopHandler;
};

с его помощью я буду реализовывать Колбек в следующий класс

class ProcessManager : public ProcessEventHandler
{
public:
ProcessManager(const std::string &sFilePath);
ProcessManager(const _int32 &ProcessID);
~ProcessManager();
............
private:
 void onProcessStart();
 void onProcessWatch();
 void onProcessCrash();
 void onProcessStopped();
 void onProcessManulyStop();
...........
};

проблема заключается в том, что для объектов

   std::function<void()> ProcessCrashHandler;
   std::function<void()> ProcessStopHandler;

в классе потомке нужно присвоить функции

void onProcessCrash();
void onProcessStopped();

пытаюсь это сделать в конструкторе

  ProcessManager::ProcessManager(const std::string &sFilePath) :
  m_ppiProcInfo(),
  m_sCommandLine(sFilePath),
  m_isRunning(false)
  {
  ProcessCrashHandler = onProcessCrash;  
  ProcessStopHandler = &ProcessManager::onProcessStopped;
  m_pcEventLoger = new EventLogger(getCurrentDirPath());
  onProcessStart();
   }

я как только уже не пробовал ничего не получается, через лямда пробовал тоже не получилось. не могу понять то ли у меня руки кривые, или с компилятором-то не в порядке Помогите пожалуйста

ошибки

 error C2679: binary '=' : no operator found which takes a right-hand operand of type 'overloaded-function' (or there is no acceptable conversion)  
 error C3867: 'ProcessManager::onProcessCrash': function call missing argument list; use '&ProcessManager::onProcessCrash' to create a pointer to member
Answer 1

Не-не, так не пойдёт.

Дело в том, что onProcessCrash — не функция! Поэтому вы не сможете сохранить её не только в переменной типа std::function<void(void)>, но даже обыкновенному указателю на функцию типа void (*)(void).

На самом деле это функция-член, для её вызова вам нужен конкретный this. Привязка this осуществляется просто: при помощи std::bind.

Попробуйте так:

ProcessCrashHandler = std::bind(&ProcessManager::onProcessCrash, this);
READ ALSO
Ошибка при выполнении программы

Ошибка при выполнении программы

Учу Си по книге Стивена Прата "СЛекции и Упражнения

257
Как сложить две строки?

Как сложить две строки?

Необработанное исключение в "0x003fd2e9 (msvcr100ddll)" в "test1

350
Перенос текста из одного ListBox в другой

Перенос текста из одного ListBox в другой

Прошу, подскажите, мне нужно перенести весь текст элемента ListBox в другойЭтот код переносит почему-то только часть текста:

257