我正在尝试为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
的定义。但是我无法确定那段代码的作用,更不用说定义自己的版本来填补那段空白了。
那那段代码是做什么的,我可以实施自己的修复程序吗?
答案 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; }