2013-02-28 4 views
3

아래의 첫 번째 코드 조각에서 볼 수 있듯이 클래스 생성자의 매개 변수로 클래스의 멤버 함수를 받아들이는 방식으로 C++ 11 스레드를 실험하려고합니다. 20 표시되어 있습니다. 클래스 정의는 두 번째 코드 스 니펫에 나와 있습니다. 이 코드가 컴파일 될 때, 나는 제 3의 발췌 문장에서 보여지는 많은 오류를 얻고있다. 아무도 내가 뭘 잘못하고 있다고 말할 수 있습니까? 감사.클래스의 멤버 함수 실행

SNIPPET 1 스레드 초기화 (main_app.cpp)

#include <thread> 
#include "ServiceRegistrar.hpp" 

#define SERVER_TYPE 100065 
#define SERVER_INST_LOWER 1 
#define SERVER_INST_UPPER 2 
#define TIMEOUT 500000 

int main() 
{ 
    ServiceRegistrar sr1(SERVER_TYPE, TIMEOUT, SERVER_INST_LOWER, SERVER_INST_LOWER); 
     /*LINE 20 is the following*/ 
    std::thread t(&ServiceRegistrar::subscribe2TopologyServer, sr1); 
t.join(); 
    sr1.publishForSRs(); 

} 

SNIPPET 2 클래스 정의

class ServiceRegistrar 
{ 
    public: 
    ServiceRegistrar(int serverType, int serverTimeOut, int serverInstanceLower, int serverInstanceUpper) 
     : mServerType(serverType), 
     mServerTimeOut(serverTimeOut), 
     mServerInstanceLower(serverInstanceLower), 
     mServerInstanceUpper(serverInstanceUpper) 
     { } 

    void subscribe2TopologyServer(); 
    void publishForSRs(); 
    void publishForServices(); 

    private: 
    int mServerType; 
    int mServerTimeOut; 
    int mServerInstanceLower; 
     int mServerInstanceUpper;   
    }; 

SNIPPET 3 : 편집 출력

$ g++ -g -c -Wall -std=c++11 main_app.cpp -pthread 
    In file included from /usr/include/c++/4.7/ratio:38:0, 
      from /usr/include/c++/4.7/chrono:38, 
      from /usr/include/c++/4.7/thread:38, 
      from main_app.cpp:8: 
    /usr/include/c++/4.7/type_traits: In instantiation of ‘struct std::_Result_of_impl<false, false, std::_Mem_fn<void (ServiceRegistrar::*)()>, ServiceRegistrar>’: 
    /usr/include/c++/4.7/type_traits:1857:12: required from ‘class std::result_of<std::_Mem_fn<void (ServiceRegistrar::*)()>(ServiceRegistrar)>’ 
    /usr/include/c++/4.7/functional:1563:61: required from ‘struct std::_Bind_simple<std::_Mem_fn<void (ServiceRegistrar::*)()>(ServiceRegistrar)>’ 
/usr/include/c++/4.7/thread:133:9: required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (ServiceRegistrar::*)(); _Args = {ServiceRegistrar&}]’ 
main_app.cpp:20:64: required from here 
/usr/include/c++/4.7/type_traits:1834:9: error: no match for call to  ‘ (std::_Mem_fn<void (ServiceRegistrar::*)()>) (ServiceRegistrar)’ 
+1

아주 많은 불필요한 매크로. – Puppy

답변

4

은 분명히 대신

std::thread t(&ServiceRegistrar::subscribe2TopologyServer, &sr1); 

를 사용 ... gcc 4.7 bug입니다.

편집 : 사실 t의 스레드 로컬 저장소에 sr1을 복사하고 싶지 않으므로 어쨌든 더 좋습니다.

+0

버그 또는 아닙니다, 당신은 거의 확실하게 여기 포인터 또는 참조에 바인딩하고 싶습니다. –

+0

@MikeSeymour 예, 그냥 덧붙여진 것 –

0

시도 :

std::thread t(std::bind(&ServiceRegistrar::subscribe2TopologyServer, sr1)); 

그것이 도움이되기를 바랍니다.

+1

'bind'는'thread'와 같은 버그를 공유하지 않기 때문에 문제를 감추고 있습니다. 그러나'sr1' 복사본에 대한 바인딩은 거의 틀린 일입니다. –

+0

동의합니다. 보통 포인터 또는 shared_ptr을 사용합니다. – zzk

관련 문제