下面的Boost代码有什么作用?

时间:2019-07-08 14:11:27

标签: c++ boost embedded keil

我正在尝试为STM32编译boost库的某些部分。我已经使用bcp导出了static_vector

  

bcp boost/container/static_vector.hpp .

我可以成功编译代码,并按照此代码使用static_vector

boost::container::static_vector<int,10> vec;

但是在成功编译之前,需要禁用boost\container\allocator_traits.hpp:467中的这段代码。

template<class T>
   static void priv_construct_dispatch_next(container_detail::false_type, Allocator &, T *p, const ::boost::container::default_init_t&)
   {  ::new((void*)p) T; }

当我不禁用该位代码时,会发生以下错误:

../Inc/boost/container/allocator_traits.hpp(469): error:  #384: no instance of overloaded "operator new"  matches the argument list
            argument types are: (unsigned int, void *)
     {  ::new((void*)p) T; }

我正在使用以下定义:

BOOST_NO_CXX11_RVALUE_REFERENCES BOOST_NO_ALIGNMENT BOOST_NO_TYPEID BOOST_NO_STD_LOCALE

并且正在将Keil µVision 5与“默认的arm编译器版本5”一起使用。 Boost库的版本为1.58。

在我看来,此版本的Keil中缺少new的定义。但是我无法确定那段代码的作用,更不用说定义自己的版本来填补那段空白了。

那那段代码是做什么的,我可以实施自己的修复程序吗?

1 个答案:

答案 0 :(得分:1)

正如以上所有评论。这是placement new operator

问题是boost的版本。 1.65版(至少)已通过更改

来解决此问题
{  ::new((void*)p) T; }

进入

{  ::new((void*)p, boost_container_new_t()) T; }


注释上的旁注:Keil在<new>内确实有一个位置为new运算符的实现,但boost不包含此实现。 <new>:89

的摘录
/* Placement new. */
inline void *operator new(std::size_t, void* __ptr) throw() { return __ptr; }