2012-09-21 6 views
2

g ++ 4.7을 C++ 11 플래그와 함께 사용하고 있습니다. 이 데모에서 :C++ 11 std :: thread가 함수로 컴파일되지만 클래스가 아닙니다.

#include <iostream> 
#include <thread> 

class do_work 
{ 
public: 
    void operator()() 
    { 
    std::cout << "Doing work..." << std::endl; 
    } 
}; 

void foo() 
{ 

} 

int main() 
{ 
    // Does not work 
    std::thread t(do_work); 
    t.join(); // error: request for member ‘join’ in ‘t’, which is of non-class type ‘std::thread(do_work)’ 

    // Works 
    std::thread t2(foo); 
    t2.join(); 

    return 0; 
} 

내가 성공적으로 호출 할 생성자의 인수로 함수를 만든 스레드에서()에 가입 할 수 있습니다,하지만 난()에 가입했다 스레드에 (오류 인라인 참조) 호출 할 수 없습니다 생성자 인수로 펑터로 생성됩니다. 아무도 이것을 설명 할 수 있습니까?

+0

[C++ : "클래스 X 유형이 아닌 Y의 멤버 X에 대한 요청"의 기괴한 발생] (http://stackoverflow.com/questions/11138543/c-bizarre-occurrence-of- x-of-y-of-non-class-type 회원 요청) – ecatmur

답변

11

tdo_work을 취하고 std::thread을 반환하는 함수로 선언했습니다.

당신은 아마

do_work worker; 
std::thread t{worker}; 

또는

std::thread t{do_work{}}; 

또는

std::thread t((do_work())); 

노트를 작성하는 원하는

std::thread t(do_work()); 

이 작동하지 않습니다. 인수가없고 do_work을 반환하고 std::thread을 반환하는 함수를 취하는 것으로 t을 선언하면 vexingly parsed입니다. do_work 임시를 괄호로 묶거나 균일 한 이니셜 라이저 구문을 사용하여 언제든지 수정할 수 있습니다.

가능하면 이니셜 라이저 통일 구문을 사용하는 습관을 갖게되는 좋은 이유입니다. 당신이 다음

std::thread t{do_work}; // incorrect 

를 작성 더라면 컴파일 대신 join의 줄에 실패했을 것이다.

+1

아, 훌륭합니다. 내 어리석은 실수로 나는 단지 "doh"가 아닌 실제 물건을 배웠다. 순간 :) –

관련 문제