2013-08-25 60 views
0

我目前正在嘗試學習C++,但我遇到了一個我不明白的編譯器錯誤。有人能解釋一下編譯器錯誤的含義嗎?C++編譯器錯誤'不匹配調用函數'

1 #include <thread> 
2 #include <vector> 
3 #include <iostream> 
4 
5 namespace thread_pool { 
6 
7 class worker { 
8  public: 
9  worker(); 
10  private: 
11 }; 
12 
13 worker::worker() { std::cout << "hello from worker\n"; } 
14 
15 class pool_keeper { 
16  public: 
17  pool_keeper(int); 
18  private: 
19  std::vector<std::thread> workers_; 
20  int pool_size_; 
21 }; 
22 
23 pool_keeper::pool_keeper(int pool_size) { 
24  int i; 
25  pool_size_ = pool_size; 
26  for (i=0; i<pool_size_; i++) 
27  workers_.push_back(std::thread(worker())); 
28 } 
29 } 

編譯器給了我這樣的:

In file included from /usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/include/g++-v4/thread:39:0, 
      from 01.cpp:1: 
/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/include/g++-v4/functional: In member function ‘void std::_Bind_result<_Result, _Functor(_Bound_args ...)>::__call(std::tuple<_Args ...>&&, std::_Index_tuple<_Indexes ...>, typename std::_Bind_result<_Result, _Functor(_Bound_args ...)>::__enable_if_void<_Res>::type) [with _Res = void, _Args = {}, int ..._Indexes = {}, _Result = void, _Functor = thread_pool::worker, _Bound_args = {}, typename std::_Bind_result<_Result, _Functor(_Bound_args ...)>::__enable_if_void<_Res>::type = int]’: 
/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/include/g++-v4/functional:1378:24: instantiated from ‘std::_Bind_result<_Result, _Functor(_Bound_args ...)>::result_type std::_Bind_result<_Result, _Functor(_Bound_args ...)>::operator()(_Args&& ...) [with _Args = {}, _Result = void, _Functor = thread_pool::worker, _Bound_args = {}, std::_Bind_result<_Result, _Functor(_Bound_args ...)>::result_type = void]’ 
/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/include/g++-v4/thread:117:13: instantiated from ‘void std::thread::_Impl<_Callable>::_M_run() [with _Callable = std::_Bind_result<void, thread_pool::worker()>]’ 
      01.cpp:29:1: instantiated from here 
/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/include/g++-v4/functional:1287:4: error: no match for call to ‘(thread_pool::worker)()’ 

我試圖瞭解編譯器錯誤通過的std ::線程的代碼看意思,但我認爲有更好的方法來到一個解決方案。

回答

3

該消息表示編譯器不知道如何調用thread_pool::worker類型的對象。構造函數std::thread需要一個可調用的對象,也就是定義了一個函數或者一個帶有operator()的對象。

修復方法是將工作從thread_pool::worker的構造函數移動到operator()()

相關問題