Решите ошибку компиляции boost.thread с помощью компилятора Metrowerks - PullRequest
3 голосов
/ 10 июля 2009

Я пытаюсь использовать 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 Ответ

1 голос
/ 10 июля 2009

Второй экземпляр - это частичная специализация класса шаблона, это допустимый 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) Если честно, это было много лет назад, я не думаю, что какой-то компилятор компилировал шаблоны полностью тогда.

...