Правильный способ привязки функций-членов?

У меня есть следующий код:

#include <iostream>
#include <vector>
#include <functional>

using namespace std;
using namespace std::placeholders;

typedef std::vector<std::function<void(void)>> func_list;

class Thing {
private:
    func_list flist;
    void _sayHi() {
        cout << "hi" << endl;
    }
    void _sayNum(int num) {
        cout << num << endl;
    }
public:
    Thing();
    void sayHi();
    void sayNum(int num);
    void executeFunctions();
};

void Thing::sayHi() {
    flist.push_back(
        std::bind(&Thing::_sayHi, this)  //  Unsure of the correct usage here
    );
}

void Thing::sayNum(int num) {
    flist.push_back(
        std::bind(&Thing::_sayNum, this, num)  //  Unsure of the correct usage here
    );
}

void Thing::executeFunctions() {
    for (unsigned int i = 0; i < flist.size(); i++) {
        flist.at(i)();
    }
}

int main() {
    Thing thing = Thing();
    thing.sayHi();
    thing.sayNum(5);

    thing.executeFunctions();
}

Моя цель - просто хранить функции, когда они вызываются, чтобы их можно было выполнить позже. Я могу связать функции, не являющиеся членами, с помощью std::bind(&functionName, param1, param2), но внутри функции это больше не работает, и использование std::bind(&Class::ClassMemberFunctionName, this) оставляет меня с ошибкой unresolved externals:

Ошибка 1 error LNK2019: неразрешенный внешний символ public: __thiscall Thing::Thing(void) (??0Thing@@QAE@XZ), на который ссылается функция _main

Ошибка 2 ошибка LNK1120: 1 неразрешенный внешний

Как правильно связать функции этого класса?


person Jazcash    schedule 11.01.2015    source источник


Ответы (1)


Вам не хватает реализации конструктора Thing::Thing().

person tumdum    schedule 11.01.2015
comment
Обратите внимание, что здесь решение похоже на удаление объявления, а не на добавление определения, поскольку в классе нет ничего, что требовало бы явной инициализации. - person Mike Seymour; 11.01.2015