我试图使用Metrowerks CodeWarrior开发5.5.3使用boost.thread;在头thread.hpp,我得到他重新定义线程:: 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_data似乎申报两次。 什么C ++功能使用呢?我怎样才能克服这种缺陷的编译器?

有帮助吗?

解决方案

在第二个实例是模板类的部分特,这是有效的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)说实话,这是很多年以前,我不认为任何编译器编译模板充分当时的情况。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top