3

metrowerks codewarrior 5.5.3 で boost.thread を使用しようとしています。ヘッダー thread.hpp で、彼が thread::thread_data: を再定義しているというエラーが表示されます。

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::thread_data が 2 回宣言されているように見えます。そこではどの C++ 機能が使用されていますか? そのコンパイラの欠陥をどのように克服できますか?

4

1 に答える 1

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) 正直なところ、これは何年も前のことであり、その当時、テンプレートを完全にコンパイルしたコンパイラはなかったと思います。

于 2009-07-10T11:40:23.227 に答える