使用 Metrowerks 编译器解决 boost.thread 编译错误
Posted
技术标签:
【中文标题】使用 Metrowerks 编译器解决 boost.thread 编译错误【英文标题】:Solve boost.thread compilation error with Metrowerks compiler 【发布时间】:2009-07-10 09:57:38 【问题描述】:我正在尝试将 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) 老实说,这是很多年前的事了,我认为当时没有任何编译器完全编译模板。
【讨论】:
以上是关于使用 Metrowerks 编译器解决 boost.thread 编译错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 MetroWerks C/C++ 开发的 C/C++ 资源
Objective-C 和 MetroWerks C/C++ IDE