首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何访问boost::interprocess中的共享集?

如何访问boost::interprocess中的共享集?
EN

Stack Overflow用户
提问于 2020-09-13 00:49:22
回答 1查看 62关注 0票数 0

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

代码语言:javascript
复制
//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;
}

这个错误基本上是说

代码语言:javascript
复制
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);  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-13 06:26:43

请注意,set定义为:

代码语言:javascript
复制
template <class Key
         ,class Compare  = std::less<Key>
         ,class Allocator = void
         ,class Options = void>
class set;

因此,根据这一点,如果您以这种方式更改SHM_StringSet类型定义f,编译步骤就会通过:

代码语言:javascript
复制
typedef boost::interprocess::set<SHM_String, std::less<>, StringAllocator> SHM_StringSet;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63862677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档