Как построить вектор с заданным числом в boost interprocess и добавить к нему элементы - PullRequest
0 голосов
/ 31 января 2020

Я начал изучать библиотеку boost interprocess и столкнулся с двумя проблемами. Первый связан с построением вектора с передачей его размера.

shm.construct<MyShmVector>("MyVector")(MAX_INPUT_SIZE, std::make_pair{"not_used", 0.0}, allocInstance);

/usr/include/boost169/boost/container/string.hpp:220:22: error: no matching function for call to 'boost::interprocess::allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index> >::allocator()'
      : Allocator()

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

Вторая проблема связана с функцией emplace_back. Когда я пытаюсь таким образом добавить элемент к вектору, я получаю сообщение об ошибке:

/usr/include/boost169/boost/container/allocator_traits.hpp:415:10: error: no matching function for call to 'std::pair<boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index> > >, double>::pair(std::basic_string<char>, double)'
   {  ::new((void*)p, boost_container_new_t()) T(::boost::forward<Args>(args)...); }
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Итак, еще раз я что-то не так сделал?

Код:

#include<boost/interprocess/managed_shared_memory.hpp>
#include<boost/interprocess/containers/vector.hpp>
#include<boost/interprocess/containers/string.hpp>
#include<boost/interprocess/allocators/allocator.hpp>

constexpr int MAX_INPUT_SIZE = 10'000;
namespace bip = boost::interprocess;

class ShmWrapper
{
    using SegmentManagerType = bip::managed_shared_memory::segment_manager;
    using CharAllocator = bip::allocator<char, SegmentManagerType>;
    using MyShmString =  bip::basic_string<char, std::char_traits<char>, CharAllocator>;
    using MyShmPair = std::pair<MyShmString, double>;
    using MyShmPairAllocator = bip::allocator<MyShmPair, SegmentManagerType>;
    using MyShmVector = bip::vector<MyShmPair, MyShmPairAllocator>;
public:
    ShmWrapper()
    {
        bip::shared_memory_object::remove("SHM_SEGMENT");
        bip::managed_shared_memory shm{bip::open_or_create, "SHM_SEGMENT", MAX_INPUT_SIZE * sizeof(MyShmPair) * 4 + sizeof(MyShmVector)};

        MyShmPairAllocator const allocInstance{shm.get_segment_manager()};
        stocks_ = shm.construct<MyShmVector>("MyVector")(MAX_INPUT_SIZE, std::make_pair("not_used", 0.0), allocInstance);

        for (auto index = 1; index < MAX_INPUT_SIZE; ++index)
            stocks_->emplace_back("Item_" + std::to_string(index), 0.0);
    }

private:
    MyShmVector* stocks_;
};

int main()
{
    ShmWrapper shm;
    return 0;
}

1 Ответ

1 голос
/ 01 февраля 2020

Я просто не получаю первую ошибку, когда пробую ваш код:

https://godbolt.org/z/rBBfHe

Это обычный конструктор, который вы используете, и он существует и в std::vector, так что я не знаю, как вы можете звонить другим способом.


Я воспроизвел второй. Он жалуется, что вы использовали std::string вывод std::to_string для записи в аргумент, который boost::container::basic_string.

boost::container::basic_string немного похож на C ++ 98 reli c. В соответствии с документацией он, как и многие сторонние реализации «лучшей строки», был создан, чтобы избежать семантики копирования при записи в g cc s std::string и добавить некоторые оптимизации производительности.

Поскольку C ++ 11 запрещает копирование при записи и требует оптимизации коротких строк, есть несколько причин не использовать std::string. Просто измените эту строку:

using MyShmString =  bip::basic_string<char, std::char_traits<char>, CharAllocator>;

на эту:

using MyShmString = std::string

И она должна скомпилироваться.

...