
With gcc 4.1.2 (gcc 4.3.x is fine) I am seeing this linker error: .build/debug/working/SourceOne.o: In function `void boost::detail::atomic::platform_atomic_thread_fence<boost::memory_order>(boost::memory_order)': /thirdparty/boost/boost_1_42/boost/smart_ptr/detail/shared_count.hpp:229: multiple definition of `void boost::detail::atomic::platform_atomic_thread_fence<boost::memory_order>(boost::memory_order)' .build/debug/working/SourceTwo.o: /thirdparty/boost/boost_1_42/boost/atomic/detail/gcc-x86.hpp:63: first defined here Which doesn't make a lot of sense at first glance, but on closer inspection I see that: boost/atomic/detail/base.hpp defines platform_atomic_thread_fence as: template<typename T> static inline void platform_atomic_thread_fence(T order) { /* FIXME: this does not provide sequential consistency, need one global variable for that... */ platform_atomic<int> a; a.exchange(0, order); } and then it is defined as a specialisation in: boost/atomic/detail/gcc-x86.hpp as: template<> void platform_atomic_thread_fence(memory_order order) { switch(order) { case memory_order_seq_cst: full_fence(); case memory_order_acquire: case memory_order_consume: case memory_order_acq_rel: case memory_order_release: __asm__ __volatile__ ("" ::: "memory"); default:; } } Is this a compiler error or should the specialisation be declared as: template<> inline void platform_atomic_thread_fence(memory_order order) (which will work) Suggestions? Jamie