Устраните ошибку компиляции boost.thread с помощью компилятора Metrowerks

StackOverflow https://stackoverflow.com/questions/1108709

Вопрос

Я пытаюсь использовать 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 ++ там используется?Как я могу преодолеть этот недостаток компилятора?

Это было полезно?

Решение

Второй экземпляр является частичной специализацией класса template, это допустимо для 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