что делает следующий бит кода повышения? - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь скомпилировать части библиотеки boost для моего STM32. Я использовал 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». Библиотека буста - версия 1.58.

Мне кажется, что определение new отсутствует в этой версии Keil. Но я не могу определить, что делает этот бит кода, не говоря уже о том, чтобы определить мою собственную версию, которая заполняет этот пробел.

Так, что делает этот бит кода и я могу реализовать свое собственное исправление?

1 Ответ

1 голос
/ 08 июля 2019

Как прокомментировано все выше. Это новый оператор размещения .

Проблема в версии boost. Версия 1.65 (по крайней мере) исправила это, изменив

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

в

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


Дополнительное примечание к комментарию: Keil имеет реализацию внутри <new> для оператора размещения нового, но это не включено в boost. Отрывок из <new>:89

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