2014-01-12 35 views
2

有人可以幫我解決當我在下面創建主線程時出現的錯誤嗎?將函數傳遞給新線程時發生編譯器錯誤?

#include "lock_free_queue.h" 
#include "Consumer.h" 
#include <thread> 

int main(){ 
    lock_free_queue* my_queue = new lock_free_queue(); 
    Consumer* c = new Consumer(my_queue); 

    //Error occurs here I think 
    std::thread t3(&Consumer::start); 
    ... 
    t3.join(); 

Consumer.h(其所有的頭,因爲最初打算使用模板):

#ifndef CONSUMER_H 
#define CONSUMER_H 

#include "lock_free_queue.h" 
#include <iostream> 

class Consumer{ 
public: 

    Consumer(lock_free_queue* queue) : the_queue(queue){} 

    void start(){ 
     consume = true; 
     while(consume){ 
      while(the_queue->getSize()==0){} 
      process(); 
     } 
    } 

我得到這個錯誤(相當可怕的前瞻性):

1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\functional(1152): error C2064: term does not evaluate to a function taking 0 arguments 
1>   class does not define an 'operator()' or a user defined conversion operator to a pointer-to-function or reference-to-function that takes appropriate number of arguments 
1>   C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\functional(1152) : while compiling class template member function 'void std::_Bind<_Forced,_Ret,_Fun,_V0_t,_V1_t,_V2_t,_V3_t,_V4_t,_V5_t,<unnamed-symbol>>::operator()(void)' 
1>   with 
1>   [ 
1>    _Forced=true, 
1>    _Ret=void, 
1>    _Fun=std::_Pmf_wrap<void (__cdecl Consumer::*)(void),void,Consumer,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>, 
1>    _V0_t=std::_Nil, 
1>    _V1_t=std::_Nil, 
1>    _V2_t=std::_Nil, 
1>    _V3_t=std::_Nil, 
1>    _V4_t=std::_Nil, 
1>    _V5_t=std::_Nil, 
1>    <unnamed-symbol>=std::_Nil 
1>   ] 
1>   C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\thr/xthread(195) : see reference to function template instantiation 'void std::_Bind<_Forced,_Ret,_Fun,_V0_t,_V1_t,_V2_t,_V3_t,_V4_t,_V5_t,<unnamed-symbol>>::operator()(void)' being compiled 
1>   with 
1>   [ 
1>    _Forced=true, 
1>    _Ret=void, 
1>    _Fun=std::_Pmf_wrap<void (__cdecl Consumer::*)(void),void,Consumer,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>, 
1>    _V0_t=std::_Nil, 
1>    _V1_t=std::_Nil, 
1>    _V2_t=std::_Nil, 
1>    _V3_t=std::_Nil, 
1>    _V4_t=std::_Nil, 
1>    _V5_t=std::_Nil, 
1>    <unnamed-symbol>=std::_Nil 
1>   ] 
1>   C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\thread(52) : see reference to class template instantiation 'std::_Bind<_Forced,_Ret,_Fun,_V0_t,_V1_t,_V2_t,_V3_t,_V4_t,_V5_t,<unnamed-symbol>>' being compiled 
1>   with 
1>   [ 
1>    _Forced=true, 
1>    _Ret=void, 
1>    _Fun=std::_Pmf_wrap<void (__cdecl Consumer::*)(void),void,Consumer,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>, 
1>    _V0_t=std::_Nil, 
1>    _V1_t=std::_Nil, 
1>    _V2_t=std::_Nil, 
1>    _V3_t=std::_Nil, 
1>    _V4_t=std::_Nil, 
1>    _V5_t=std::_Nil, 
1>    <unnamed-symbol>=std::_Nil 
1>   ] 
1>   Main.cpp(10) : see reference to function template instantiation 'std::thread::thread<void(__cdecl Consumer::*)(void)>(_Fn)' being compiled 
1>   with 
1>   [ 
1>    _Fn=void (__cdecl Consumer::*)(void) 
1>   ] 

回答

6

Consumer::start是一個非靜態成員函數。這意味着它需要一個Consumer的實例來執行。在形式上,這是通過給非靜態成員函數一個隱含的第一個參數this來完成的。 std::thread期望您傳遞可用作此第一個參數的參數的內容。

所以,你需要一個Consumer實例或指針傳遞給一個實例,爲成員函數,在行動:

std::thread t3(&Consumer::start, c); 
+2

'reference_wrapper'沒有指定在這種情況下,除了工作,用'STD: :bind'。見[這個問題](http://stackoverflow.com/questions/21059115/c11-thread-class-how-to-use-a-class-member-function),和/或[LWG issue 2219](http: //cplusplus.github.io/LWG/lwg-active.html#2219)。 – Casey

+0

對不起!我正在使用我寫的一箇舊例子,我認爲這個參數是針對函數調用的,而不是該類的實例:) – mezamorphic

+0

@Casey我認爲它是。 – juanchopanza

相關問題