【问题标题】:How do I access a shared set in boost::interprocess?如何访问 boost::interprocess 中的共享集?
【发布时间】:2020-12-30 21:34:21
【问题描述】:

以下代码有什么问题?我正在尝试创建一个共享集并向其中添加一些字符串。编译器抛出一个非常冗长的错误,超出了我对 c++ 的有限理解,更不用说 boost。


//g++ test.cpp -lboost_thread -lrt -lpthread

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

using namespace boost::interprocess;

typedef boost::interprocess::allocator<char, managed_shared_memory::segment_manager> CharAllocator;
typedef boost::interprocess::basic_string<char, std::char_traits<char>, CharAllocator> SHM_String;
typedef boost::interprocess::allocator<SHM_String, managed_shared_memory::segment_manager> StringAllocator;
typedef boost::interprocess::set<SHM_String, StringAllocator> SHM_StringSet;
typedef allocator<SHM_StringSet, managed_shared_memory::segment_manager> ShmemAllocator;

offset_ptr<SHM_StringSet> create_stringset_and_add_ten_strings(managed_shared_memory* segment, 
            CharAllocator* ca, 
            std::string name,
            std::string arr[10]) {
    ShmemAllocator alloc_inst (segment->get_segment_manager());
    offset_ptr<SHM_StringSet> m_pset = segment->construct<SHM_StringSet>(name.c_str())(alloc_inst);

    for (int i = 0; i < 10; i++) {
        SHM_String mystringFirst(*ca);   
        mystringFirst = arr[i].c_str();
        m_pset->insert(mystringFirst);
    }

    return m_pset;
}

int main ()
{

    shared_memory_object::remove("SharedMemoryName");
    managed_shared_memory segment(create_only,"SharedMemoryName",65536);
    
    CharAllocator charallocator(segment.get_segment_manager());
    std::string xnames[10] = { "car", "bike", "truck", "bus", "bicycle", "car", "bike", "truck", "bus", "bicycle" }; 
    create_stringset_and_add_ten_strings(&segment, &charallocator, "vehicles",  xnames);

    return 0;
}

错误基本上是说

usr/include/boost/container/detail/tree.hpp:468:30: error: no match for call to ‘(const key_compare {aka const boost::interprocess::allocator<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> > >, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index> >}) (const key_type&, const key_type&)’
  468 |    {  return this->key_comp()(this->key_from(nonkey1), key2);  }

【问题讨论】:

    标签: c++ c++11 boost g++ shared-memory


    【解决方案1】:

    注意set的定义是:

    template <class Key
             ,class Compare  = std::less<Key>
             ,class Allocator = void
             ,class Options = void>
    class set;
    

    所以,根据这个,如果你这样改变SHM_StringSet typedef,编译步骤就通过了:

    typedef boost::interprocess::set<SHM_String, std::less<>, StringAllocator> SHM_StringSet;
    

    【讨论】:

    • 谢谢!这就是问题所在。
    猜你喜欢
    • 2015-09-10
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 2012-11-05
    相关资源
    最近更新 更多