2017-07-29 72 views
0

我想通過引用傳遞給線程,一個變量定義爲:不能按引用傳遞到線程

zmq::context_t context(1); 

這樣的:

t[thread_nbr] = std::thread(worker_routine, (void *)&context, trained_images); 

然而,當我做我得到的以下錯誤:

/usr/include/c++/5/functional:1505:61: error: no type named ‘type’ in ‘class std::result_of<void* (*(void*, std::vector<TrainedImage>))(void*, std::vector<TrainedImage>&)>’ 
    typedef typename result_of<_Callable(_Args...)>::type result_type; 
                 ^
/usr/include/c++/5/functional:1526:9: error: no type named ‘type’ in ‘class std::result_of<void* (*(void*, std::vector<TrainedImage>))(void*, std::vector<TrainedImage>&)>’ 
    _M_invoke(_Index_tuple<_Indices...>) 

如果我嘗試做std::ref()有了它,我收到了刪除功能的錯誤。

有誰知道我能做什麼?

+2

是什麼'worker_routine'的簽名? – user463035818

+5

[Off Topic]當你使用'std :: thread'時,你真的不需要將任何東西投射到'void *'。它被設計用於類型系統。 – NathanOliver

+1

您可以嘗試創建一個[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)並向我們展示?包括'worker_routine'和'trained_images'的聲明(至少)。 –

回答

2

這個問題似乎是你的線程函數作爲參數引用的參數trained_images。與此問題是std::thread對象不能真正處理引用(它副本參數的線程函數,並且引用不能被複制)。

的解決方案是使用包裝對象像std::ref爲引用:

t[thread_nbr] = std::thread(worker_routine, &context, std::ref(trained_images));