使用Metrowerks编译器解决boost.thread编译错误

时间:2009-07-10 09:57:38

标签: c++ boost-thread codewarrior metrowerks

我正在尝试使用boost.thread和metrowerks codewarrior 5.5.3;在头文件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似乎被声明了两次。 那里使用了什么C ++功能?如何克服编译器缺陷?

1 个答案:

答案 0 :(得分: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)老实说,这是很多年前的事了,我认为任何编译器都不会完全编译模板。

相关问题