Вывод аргумента шаблона и ссылка на функцию - PullRequest
0 голосов
/ 17 ноября 2018

Я столкнулся с проблемой косвенного вызова экземпляра шаблона функции.Структура ниже определяет тип аргумента, передаваемого косвенно (весь следующий код принадлежит одному файлу .hpp):

template<typename individual, typename fitness_value>
struct global_model_worker_state: public base_state {

global_model_worker_state(
        const global_model_worker_state<individual, fitness_value>&) = default;

global_model_worker_state(const shared_props& props,
        const fitness_evaluation_operator<individual, fitness_value>& feo) :
        base_state { props }, fitness_evaluation { feo } {
}

global_model_worker_state& operator=(
        const global_model_worker_state<individual, fitness_value>&) = default;

global_model_worker_state& operator=(
        global_model_worker_state<individual, fitness_value>&&) = default;

fitness_evaluation_operator<individual, fitness_value> fitness_evaluation;
};

Функция, ссылка на которую не может быть разрешена:

template<typename individual, typename fitness_value>
behavior global_model_worker(
        stateful_actor<global_model_worker_state<individual, fitness_value>>* self,
        global_model_worker_state<individual, fitness_value> state) {
    self->state = std::move(state);

    return {
        [=](compute_fitness, const individual& ind) {
            // Undefined reference
            return self->state.fitness_evaluation(ind);
        },
    };
}

Затем я перехожу к вызову spawn, который принимает ссылку на функцию и любое количество аргументов, переданных этой функции.

template<typename individual, typename fitness_value>
void run() {
     ...
     self->spawn(
             global_model_worker<individual, fitness_value>,
             global_model_worker_state<individual, fitness_value> {
                     self->state.props, feo 
             });
 }

Затем в файле .cpp:

 run<std::vector<bool>, int>();

компоновщик возвращает сообщение об ошибке undefined reference to Common::genetic_operator<int, std::vector<bool, std::allocator<bool> > const&>::operator()(std::vector<bool, std::allocator<bool> > const&), которое является экземпляром шаблона класса genetic_operator<individual, fitness_value> (из которых fitness_evaluation_operator является псевдонимом).

Я не могу скомпилировать этот код, поскольку (предположительно) конкретный типиз fitness_evaluation не может быть выведено, хотя косвенный способ, которым будет вызываться global_model_worker<individual, fitness_value> (о котором компилятор не знает).У меня вопрос, есть ли способ предложить обойти эту проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...