2009-07-10 59 views
3

我想用metrowerks codewarrior 5.5.3使用boost.thread;在头thread.hpp,我得到的错误,他是重新定义线程:: 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_data似乎申报两次。 那里使用了哪些C++功能?我如何克服编译器缺陷?

回答

1

第二个实例是模板类的部分特,这是有效的C++和不应导致的重新定义错误。

我已经受够了在过去Metrowerks的编译器,功能问题太多,虽然,更具体地说,使用默认值模板的模板参数时,编译器将永远不会编译它。我的解决方法是相当简单的,不提供一个默认值(1)

如果我是你,我会尝试加入了全专门为您的特定类型,并希望编译器使用一些不同的编译路径这些,并让你过去,这.... (这只是胡乱猜测,我没有/使用Metrowerks的编译器这些天)

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 2009-07-10 13:41:19