Boost Multi Index标识索引

Boost Multi Index Identity index

本文关键字:索引 标识 Index Multi Boost      更新时间:2023-10-16

我正在尝试为multi_index_container制作一些包装器类。

基本上我只想导出这些操作:

  1. 插入元素
  2. Remove Element(for a given Element)
  3. 按键获取元素
定义了以下代码:
    typedef boost::multi_index::multi_index_container<
        SR, boost::multi_index::indexed_by<
        boost::multi_index::ordered_unique<boost::multi_index::tag<SR::ByIdentity>,boost::multi_index::identity<SR> >
        , boost::multi_index::ordered_unique< boost::multi_index::tag<ByName>,boost::multi_index::const_mem_fun<SR,const std::string&
        , &SR::GetName> >
        , boost::multi_index::ordered_non_unique<boost::multi_index::tag<ByID>,boost::multi_index::const_mem_fun<SR, ID
        , &SR::GetID> >
        >
    > SRs;

地点:

SR::ByIdentity内部空结构

ByNameByID是预定义的空结构体。

是SR

中定义的函数
ID SetID(ID ID);
ID GetID() const;
void SetName(const std::string& name);
const std::string& GetName() const;

,这是插入,删除和获取的代码

    bool Insert(ElementType val)
    {
        return m_container.insert(val).second;
    }
    void Remove(ElementType val)
    {
        iterator It = m_container.get<ByIdenetity>().find(val);
        if (It != m_container.end())
        {
            m_container.erase(It);
        }
    }
    template<typename Iterator> const_iterator Get(typename Iterator::mtype val) const
    {
        typename Iterator::iterator::const_iterator It = m_container.get<typename Iterator::index>().find(val);
        return It;
    }

其中typename Iterator定义为

中的一个
    struct IdentityIterator
    {
        typedef ByIdentity index;
        typedef SR mtype;
        typedef SRs::index<ByIdentity>::type iterator;
    } ;

    struct NameIterator
    {
        typedef ByName index;
        typedef const std::string& mtype;
        typedef SRs::index<ByName>::type iterator;
    } ;

    struct NameIterator
    {
        typedef ByID index;
        typedef ID mtype;
        typedef SRs::index<ByID>::type iterator;
    } ;

我得到以下编译错误:

        In member function ?€˜typename ContainerType::const_iterator ns1::ContainerWrapper<ContainerType>::get(typename Iterator::mtype) const [with Iterator = ns2::NameIter, ContainerType = boost::multi_index::multi_index_container<ns2::SR, boost::multi_index::indexed_by<boost::multi_index::ordered_non_unique<boost::multi_index::tag<ns2::ByIdentity, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, boost::multi_index::identity<ns2::SR>, mpl_::na>, boost::multi_index::ordered_unique<boost::multi_index::tag<ns2::ByName, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, boost::multi_index::const_mem_fun<ns2::SR, const std::string&, &ns2::SR::GetName>, mpl_::na>, boost::multi_index::ordered_non_unique<boost::multi_index::tag<ns2::ByID, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, boost::multi_index::const_mem_fun<ns2::SR, int, &ns2::SR::GetRoleID>, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::allocator<ns2::SR> >]?€™:
ns3/testFile.cpp:509:   instantiated from here
../ns1/ContainerWrapper.h:114: error: conversion from ?€˜boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::index_node_base<ns2::SR, std::allocator<ns2::SR> > > > >?€™ to non-scalar type ?€˜boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::index_node_base<ns2::SR, std::allocator<ns2::SR> > > > > >?€™ requested

当我删除boost::multi_index::ordered_unique<boost::multi_index::tag<SR::ByIdentity>,boost::multi_index::identity<SR> >

时,这不会发生。

任何想法?

您的Get成员函数在应该返回Iterator::iterator::const_iterator时返回了一些const_iterator