使用进程间映射的Boost模板错误
Boost template error using inter-process map
编辑:虽然不是严格的答案,我正在寻找,这是因为我问错了问题。我把这个问题标记为"回答",因为它帮助我看到我做错了什么(当回到上下文中时,职业结构没有意义,需要使用类似的更改进行不同的重做),我认为海报应该得到代表提升,因为他称之为"非标准"。"
请花点时间帮助解决这个问题。如果你比我对Boost更有经验,应该不难。
我使用Boost 1.57做IPC。我试图使一对(void *, struct)的共享映射。这是一个完整的程序(短)。你可以把它插入到MSVC中(或者,修改main()声明并将其更改为常规的managed_shared_memory, GCC或Clang)。
可以在http://pastebin.com/caNNdztt上找到语法高亮显示的代码(尽管我忘了去掉代码中没有的#define的一个用法,它被替换为0x30000000)
#include <iostream>
#include <boost/interprocess/mapped_region.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/managed_windows_shared_memory.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/containers/map.hpp>
using namespace boost::interprocess;
typedef void* mem_managed_type; // GLE_GLOBAL is just void *, but changing it to int doesn't work
struct global_ptr_state; // This is just a POD struct, the definition doesn't matter
//typedef managed_shared_memory mem_manager_t;
typedef managed_windows_shared_memory mem_manager_t;
typedef std::pair<const mem_managed_type, global_ptr_state> global_state_pair;
typedef mem_manager_t::segment_manager segm_t;
typedef allocator< global_state_pair, segm_t > my_global_allocator;
typedef std::less<mem_managed_type> mem_managed_type_less;
typedef mem_manager_t::segment_manager segm_manager;
typedef map<const mem_managed_type, global_ptr_state, mem_managed_type_less, my_global_allocator> global_ptr_pair_map;
int _tmain(int argc, _TCHAR* argv[])
{
segm_manager *_segm_manager;
my_global_allocator *_allocatr;
global_ptr_pair_map *global_map;
mem_manager_t managed_pool;
managed_pool = mem_manager_t(create_only, "thisdoesntmatter", 65536, (void *)0x3C000000);
shared_memory_object _stator_share(open_only, "thisdoesntmattereither", read_write);
mapped_region _stator_region(_stator_share, read_write, 0, 0, (void *)0x30000000);
_segm_manager = managed_pool.get_segment_manager();
_allocatr = new my_global_allocator(_segm_manager);
// This line throws the error
global_map = new global_ptr_pair_map; // This line causes the compilation error
}
错误的简短版本是
1>c:boostincludeboost-1_57boostcontainermap.hpp(493): error C2535: 'std::pair<boost::container::container_detail::iterator<boost::intrusive::tree_iterator<boost::intrusive::bhtraits<T,boost::intrusive::rbtree_node_traits<boost::interprocess::offset_ptr<void,ptrdiff_t,size_t,0>,true>,normal_link,boost::intrusive::default_tag,3>,false>,false>,bool> boost::container::map<const mem_managed_type,global_ptr_state,mem_managed_type_less,my_global_allocator,boost::container::tree_assoc_defaults>::insert(const std::pair<const mem_managed_type,global_ptr_state> &)'
: member function already defined or declared
整个错误可以在Pastebin上找到
http://pastebin.com/gjk1e1N7据我所知,它在抱怨这个:
std::pair<iterator,bool> insert(const nonconst_value_type& x)
{ return this->base_t::insert_unique(x); }
将上面的语句替换为头文件中的
std::pair<iterator,bool> insert(const value_type& x)
{ return this->base_t::insert_unique(x); }
我已经无计可施了。请帮助!
您需要调用construct
来在shmem内创建映射,而不是使用new
,再加上一些更多的修复:
typedef void* mem_managed_type; // GLE_GLOBAL is just void *, but changing it to int doesn't work
struct global_ptr_state{}; // This is just a POD struct, the definition doesn't matter
typedef managed_windows_shared_memory mem_manager_t;
typedef std::pair<const mem_managed_type, global_ptr_state> global_state_pair;
typedef mem_manager_t::segment_manager segm_t;
typedef allocator< global_state_pair, segm_t > my_global_allocator;
typedef std::less<mem_managed_type> mem_managed_type_less;
typedef mem_manager_t::segment_manager segm_manager;
typedef map<mem_managed_type, global_ptr_state, mem_managed_type_less, my_global_allocator> global_ptr_pair_map;
int _tmain(int argc, _TCHAR* argv[])
{
segm_manager *_segm_manager;
global_ptr_pair_map *global_map;
mem_manager_t managed_pool;
managed_pool = mem_manager_t(create_only, "thisdoesntmatter", 65536, (void *)0x3C000000);
shared_memory_object _stator_share(open_only, "thisdoesntmattereither", read_write);
mapped_region _stator_region(_stator_share, read_write, 0, 0, (void *)0x30000000);
_segm_manager = managed_pool.get_segment_manager();
my_global_allocator _allocatr = _segm_manager;
global_map = managed_pool.construct<global_ptr_pair_map>("mymap")(mem_managed_type_less(), _allocatr);
}
你正在做它在一个有点"非标准"的方式,所以我不能告诉如果代码将工作。为什么不遵循boost进程间教程?
相关文章:
- boost::进程间消息队列引发错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在cygwin中测试新的boost安装时出现cpp错误
- 错误"Could not find Boost"(缺少:上下文标头)
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- VS Code C++:不准确的系统包括路径错误(wchar.h,boost/lambda/lambda.hpp)
- 尝试将 boost::stacktrace 添加到 CMake 项目时出现构建错误
- 在 boost::qi 中使用过多的替代运算符会导致分段错误
- 使用boost::multiprecision cpp_int左移时出现超时错误
- 致命错误:找不到'boost/uuid/uuid.hpp'文件
- 在其他容器中使用 boost::container::static_vector 时,GCC 编译错误"将'const s'绑定到类型's&'的引用丢弃限定符"
- boost::interprocess::file_lock 与 std::ostream 一起使用时的错误行为
- 造成致命错误:boost/fusion/iterator/equal_to.hpp 没有这样的文件或目录
- 在 Centos7 上使用 boost 1.71.0 编译错误
- boost::p rogram_options 在指定意外的位置参数时不报告任何错误
- Boost错误消息
- Boost错误:Boost.文件系统V3及更高版本需要std::wstring支持
- 如何正确地反检查Boost错误代码
- 调试时在has_new_operator.hpp中出现Boost错误
- 哪些Boost.Asio调用返回哪些Boost错误代码/条件