不明确的映射.插入boost
ambiguous map.insert in boost
我正试图将值插入到boost映射中,但在boost映射insert中对insert语句的调用不明确。
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/containers/map.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <functional>
#include <utility>
using namespace boost::interprocess;
int main ()
{
// remove earlier existing SHM
shared_memory_object::remove("SharedMemoryName");
// create new
managed_shared_memory segment(create_only,"SharedMemoryName",65536);
//Note that map<Key, MappedType>'s value_type is std::pair<const Key, MappedType>,
//so the allocator must allocate that pair.
typedef std::string KeyType;
typedef map<std::string, int> MappedType;
typedef std::pair<const KeyType, MappedType> ValueType;
//allocator of for the map.
typedef allocator<ValueType, managed_shared_memory::segment_manager> ShmemAllocator;
//Initialize the shared memory STL-compatible allocator
ShmemAllocator alloc_inst (segment.get_segment_manager());
//third parameter argument is the ordering function is used to compare the keys.
typedef map<KeyType, MappedType, std::less<KeyType>, ShmemAllocator> MySHMMap;
//offset ptr within SHM for map
offset_ptr<MySHMMap> m_pmap = segment.construct<MySHMMap>("MySHMMapName")(std::less<std::string>(), alloc_inst);
//Insert data in the map
std::string my_string = "test";
m_pmap[0].insert(std::make_pair( my_string, 0) );
return 0;
}
被调用的boost API有:
std::pair<iterator,bool> insert(const nonconst_value_type& x)
std::pair<iterator,bool> insert(const value_type& x)
typedef typename tree_t::value_type value_type;
typedef std::pair<key_type, mapped_type> nonconst_value_type;
错误日志:
/home/user/droy/src/quotes/shmmutimap/src/writer.cxx:39: error: call of overloaded 'insert(std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int>)' is ambiguous
/home/dev/build/third_party/64-rhel5/boost_1_47_0/include/boost/interprocess/containers/container/map.hpp:410: note: candidates are: std::pair<typename boost::container::containers_detail::rbtree<Key, std::pair<const Key, T>, boost::container::containers_detail::select1st<std::pair<const Key, T> >, Pred, Alloc>::iterator, bool> boost::container::map<Key, T, Pred, Alloc>::insert(const typename boost::container::containers_detail::rbtree<Key, std::pair<const Key, T>, boost::container::containers_detail::select1st<std::pair<const Key, T> >, Pred, Alloc>::value_type&) [with Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, T = boost::container::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int> > >, Pred = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, Alloc = boost::interprocess::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::container::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int> > > >, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index> >]
/home/dev/build/third_party/64-rhel5/boost_1_47_0/include/boost/interprocess/containers/container/map.hpp:421: note: std::pair<typename boost::container::containers_detail::rbtree<Key, std::pair<const Key, T>, boost::container::containers_detail::select1st<std::pair<const Key, T> >, Pred, Alloc>::iterator, bool> boost::container::map<Key, T, Pred, Alloc>::insert(const std::pair<typename boost::container::containers_detail::rbtree<Key, std::pair<const Key, T>, boost::container::containers_detail::select1st<std::pair<const Key, T> >, Pred, Alloc>::key_type, T>&) [with Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, T = boost::container::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int> > >, Pred = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, Alloc = boost::interprocess::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::container::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int> > > >, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family, boost::interprocess::offset_ptr<void>, 0ul>, boost::interprocess::iset_index> >]
insert语句的参数最终是相同的类型,我该如何解决这个问题,有什么提示吗?
现在,您创建了一个map<string, map<string, int>>
。我想你的意图只是创建一个map<string, int>
。要做到这一点,您需要对代码进行一个非常简单的修复:
// typedef map<std::string, int> MappedType;
typedef int MappedType;
顺便说一句,你也可以把代码的最后一行写成:
// m_pmap[0].insert(std::make_pair( my_string, 0) );
m_pmap[0][my_string] = 0;
更新:
由于我的直觉似乎是错误的,并且您确实想要创建map<string, map<string, int>>
,因此响应略有不同。
请注意,您的呼叫基本上是在尝试这样做:
map<string, int> x(0);
m_pmap[0][my_string] = x;
请注意,map<string, int>
没有采用整数的构造函数。相反,您可以执行以下任何操作:
m_pmap[0].insert(std::make_pair( my_string, map<std::string, int>()));
m_pmap[0].insert(std::make_pair( my_string, MappedType()));
m_pmap[0][my_string] = map<std::string, int>();
m_pmap[0][my_string] = MappedType();
您也可以简单地利用map
的工作方式,并执行以下操作:
m_pmap[0]["us"]["abc"] = 2030;
m_pmap[0]["us"]["def"] = 1230;
相关文章:
- 插入 boost::multi_index 后迭代器变得无效?
- 为什么 Boost unordered_map 在第一次插入时需要太多时间?
- 如何将值插入到 c++ boost::multiindex 集合的特定索引中,就像在 std::list 中一样
- 通过索引操作员插入boost :: program_options :: variables_map
- 有没有办法插入到带有多个提示的 boost::multi_index 中
- 在std :: map中插入boost :: unique_ptr
- 将 boost::d ynamic_bitset<> 插入 boost::bimap
- 如何使用C 将Boost Ptree插入MongoDB
- 使用boost::关联属性映射插入boost::BIMAP..失败
- 插入Boost UBLAS矩阵MATLAB样式的数据
- 使用boost::引用元组作为orderedunique索引的关键字时出现boost多索引插入错误
- 将std::map复制/插入到boost::bimap中
- 在 unordered_map Boost 中插入模板值时出错
- Boost MultiIndexContainer,如何进行延迟索引以快速插入
- 在 Boost.Log (Boost 1.60.0) 中重载插入运算符
- Boost 如何将流插入直接插入到 C 字符串中
- boost多索引排序索引中插入的匹配函数
- 在boost::interprocess::映射中插入
- 不明确的映射.插入boost
- 在boost::any的映射中插入元素,并返回对它的引用