Функция C ++ в качестве параметра с использованием std :: bind из другой функции Ошибка компоновщика - PullRequest
0 голосов
/ 25 марта 2020

Предположим, что класс C содержит функцию doSomething, которая вызывается повторно, и ее результаты являются обязательными для множества других функций различных классов. Так что в этом случае функция запуска класса B. Это должно работать из другого класса C. Я думаю, это должно быть довольно просто с std :: bind.

Но это работает, только если doSomething принадлежит C. Если я звоню из другого класса, я получаю ошибку компоновщика. Чего мне не хватает?

#include <iostream>
#include <functional>
class A {
public:
    A() {}
    template<typename Callable>
    void doSomething(Callable f); 
};

template<typename Callable>
void A::doSomething(Callable f) {
    // do some stuff 
    int input = 1;
    f(input); // B::start should be called here
}

class B {
    public:
         B() {}
         void start(int input);
};

void B::start(int input) {
    std::cout << "dostuff" << std::endl;
    // do some other stuff
}

class C {
    private:
        A a;
    public:
        C() : a() {
            B b;
            a.doSomething(std::bind(&B::start, b, std::placeholders::_1)); 
            // if doSomething would be a member of class C then 
            // doSomething(std::bind(&B::start, b, std::placeholder//::_1) would work 
        }
};

int main() {
   C c;
}

Чего мне не хватает?

Undefined symbols for architecture x86_64:
  "void A::doSomething<std::_Bind<void (B::*(B))()> >(std::_Bind<void (B::*(B))()>)", referenced from:
      C::C(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) in C.cpp.o
      C::C(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) in C.cpp.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...