2013-06-21 80 views
0

我想爲multi_index_container做一些包裝類。增強多索引身份索引

基本上我只想導出這些操作:

  1. 插入元素
  2. 刪除元素(給定元素)
  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> >

任何想法,這不會發生?

回答

0

您的Get當它返回Iterator::iterator::const_iterator時,成員函數返回一些const_iterator

+0

const_iterator據我所知是一個迭代器,可以用任何Iterator :: iterator :: const_iterator實例化。 –

+0

你沒有在代碼片段中提供const_iterator的定義,但是假設const_iterator是SRs :: index :: type :: const_iterator,答案是:no,不同的索引具有不能直接轉換的不同類型的迭代器彼此之間。考慮迭代器投影:http://www.boost.org/libs/multi_index/doc/tutorial/basics.html#projection –