2009-07-10 2 views
3

metrowerks 코드 워리어 5.5.3으로 boost.thread를 사용하려고합니다. 나는 효과, 스레드가 :: thread_data 두 번 선언 할 것, 볼Metrowerks 컴파일러에서 boost.thread 컴파일 오류를 해결합니다.

class BOOST_THREAD_DECL thread 
{ 
private: 
    ...   
    template<typename F> 
    struct thread_data: 
     detail::thread_data_base 
    { 
     F f; 

     thread_data(F f_): 
      f(f_) 
     {} 
     thread_data(detail::thread_move_t<F> f_): 
      f(f_) 
     {} 

     void run() 
     { 
      f(); 
     } 
    }; 
    ... 
}; 

template<typename F> 
struct thread::thread_data<boost::reference_wrapper<F> >: 
    detail::thread_data_base 
{ 
    F& f; 

    thread_data(boost::reference_wrapper<F> f_): 
     f(f_) 
    {} 

    void run() 
    { 
     f(); 
    } 
}; 

: 헤더 thread.hpp에, 나는 그가 스레드 :: thread_data을 재정의있어하는 오류가 발생합니다. 거기에 어떤 C++ 기능이 사용됩니까? 컴파일러 결함을 어떻게 극복 할 수 있습니까?

답변

1

두 번째 인스턴스는 템플릿 클래스의 부분 특수화입니다. 이는 유효한 C++이며 재정의 오류가 발생하지 않아야합니다.

과거에 metrowerks 컴파일러에서 이러한 기능에 문제가있었습니다. 더 구체적으로 템플릿 템플릿 매개 변수를 기본값으로 사용할 때 컴파일러는 컴파일하지 않습니다. 내 해결 방법은 비교적 간단합니다. 기본값을 제공하지 마십시오. (1)

특정 유형의 전체 전문화를 추가하려고 시도했지만 컴파일러가 다른 컴파일 경로를 사용하기를 바랍니다. 사람들이지나를 가져옵니다 ....

typedef boost::function< void() > MyThreadFunction; // or whatever you need 

template <> 
struct thread::thread_data<boost::reference_wrapper<MyThreadFunction> >: 
    detail::thread_data_base 
{ 
    .... 
}; 

(1) 솔직히 말해서,이 있었다 몇 년 (이, 나는 /이 요즘 메트로 웍스 컴파일러를 사용하지 않는 단지 추측입니다) 전, 필자는 어떤 컴파일러도 완전히 컴파일 된 템플릿을 생각하지 않습니다.

+0

명확하고 정확한 답변을 주셔서 감사합니다. :) – akappa

관련 문제