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