提升多指数身份指数

时间:2013-06-21 08:42:39

标签: c++ templates boost multi-index

我正在尝试为multi_index_container创建一些包装类。

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

  1. 插入元素
  2. 删除元素(对于给定元素)
  3. 按键获取元素
  4. 定义了以下代码:

        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;
    

    这是Insert,Remove和Get

    的代码
        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> >

    时不会发生这种情况

    任何想法?

1 个答案:

答案 0 :(得分:0)

Get成员函数返回const_iterator时,会返回一些Iterator::iterator::const_iterator