将线程上的矢量引用传递给对象的成员函数时出错

时间:2017-07-02 03:18:15

标签: multithreading oop c++11

我有3个文件:future.cpp,future.hpp和main.cpp。我在.hpp中声明了一个未来的类,如下所示:

class future_multithread{

private:
std::vector<std::vector<int>>my_input_list;
int number_of_cores;
int (*arbitrary_function)(std::vector<int>&);
std::vector<std::thread> thread_track;
std::vector<std::future<int>> futr;
semaphore* sem;

void control_threads(std::vector<int>&, std::promise<int>&&);
void launch_threads();

public:
future_multithread(int, std::vector<std::vector<int>>, int 
(*given_function)(std::vector<int>&));
void print();
void get_function_results(std::vector<int>&);
~future_multithread();

};

我在void get_function_results(std :: vector&amp;)函数中遇到问题。其实现如下:.cpp:

void future_multithread::get_function_results(std::vector<int>& results){
launch_threads();
for_each(futr.begin(), futr.end(), [this, &results](std::future<int>& ft){
results.push_back(ft.get());
});
}

从main.cpp调用此函数,如下所示:obj是对象:

`

auto th = std::thread(&future_multithread::get_function_results, &obj, &result);
th.join();`

我在main中有一个向量,需要在此函数中由未来的get()填充。由于将来的get()代码是阻塞的,我想在一个线程上启动它,以便我的main可以继续,直到这个结果被更新,而不是阻塞。当我从这个函数中提前返回一个向量时,它工作得很好。但是现在在传递引用的线程上失败了。

我得到的错误是:

`error: cannot apply member pointer ‘((const std::_Mem_fn_base<void (future_multithread::*)(std::vector<int>&), true>*)this)->std::_Mem_fn_base<void (future_multithread::*)(std::vector<int>&), true>::_M_pmf’ to ‘* __ptr’, which is of non-class type ‘future_multithread*’
  { return ((*__ptr).*_M_pmf)(std::forward<_Args>(__args)...); }`

和此:

error: return-statement with a value, in function returning 'void' [-fpermissive]{ return ((*__ptr).*_M_pmf)(std::forward<_Args>(__args)...); }

我尝试过很多东西,但我无法弄清楚出了什么问题。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

很遗憾,您还没有为std :: thread构造函数调用提供上下文,因此我不知道objresult的类型。我假设obj属于future_multithread类型,result属于std::vector<int>。在这种情况下,错误是您将指针传递给向量而不是引用:您应该将&result更改为result