2009-07-10 13 views
3

私はboost.threadをmetrowerks codewarrior 5.5.3で使用しようとしています。ヘッダ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が2回宣言しているように見える、ことがわかります。 そこにはどのようなC++機能が使われていますか?コンパイラの不足をどうやって克服できますか?

答えて

1

2番目のインスタンスはテンプレートクラスの部分的な特殊化です。これは有効な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

関連する問題