2014-04-06 5 views
0

2 질문 :
1. 회원을 통해/modify_key를 수정하려면 매개 변수를 전달해야합니까?
2. 왜 내가
multi_index 템플릿 컴파일 오류

이 오류가있는 전체 코드를 보려면이 컴파일 오류가 있습니까, 당신은 http://coliru.stacked-crooked.com/a/d6241361318e1925

볼 수있는 오류가

MultiIndex4.h: In member function 'uint32_t CrMultiParameterMultiIndex::ModifyKeyBy(SearchingKey&, ModifyKeyType&) [with SearchingTagType = IMEI_tag, ModifyingTagType = IMEI_tag, SearchingKey = uint32_t, ModifyKeyType = uint32_t]': 
MultiIndex4.h:183: instantiated from here 
MultiIndex4.h:119: error: no matching function for call to 'boost::multi_index::multi_index_container<UsersKey, UsersKey_indices, std::allocator<UsersKey> >::modify_key(boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::index_node_base<UsersKey, std::allocator<UsersKey> > > >&, boost::function<void()(uint32_t&)>&)' 
*** Errors occurred during this build *** 

내가 클래스 CrMultiParameterMultiIndex이입니다 2 개의 색인이있는 다중 색인을 보유하십시오.

키의 일부만 검색하고 키의 일부만 수정하는 템플릿 함수를 만들려고했습니다.

이 클래스는

template <typename SearchingTagType,typename ModifyingTagType,typename SearchingKey,typename ModifyKeyType> uint32_t ModifyKeyBy(SearchingKey & key,ModifyKeyType & pi_Modifykey) 
    { 
    uint32_t hRes = 1; 

    //search for entry by TagType 
    typedef typename GlobalHash::index<SearchingTagType>::type  IndexType; 
    typename IndexType::iterator it = GetIteratorBy<SearchingTagType>(key); 

    //entry found 
    if(it != m_pGlobalHash->get<SearchingTagType>().end()) 
    { 
     //Set parameter to modify 
     hRes = SetParameterKeys<ModifyingTagType>(pi_Modifykey); 

     if(hRes == 1) 
     { 
      //get iteraror to modify 
      typedef typename GlobalHash::index<ModifyingTagType>::type  ModifyIndexType; 
      typename ModifyIndexType::iterator itToModify = m_pGlobalHash->get<ModifyingTagType>().iterator_to(*it); 

      boost::function<void(ModifyKeyType &)> f = boost::bind(&CrMultiParameterMultiIndex::ModifyKey<ModifyingTagType, ModifyKeyType >, this, _1); 

      //modify key failed 
      if(m_pGlobalHash->modify_key(itToModify , f)==false) 
       hRes = 0; 
     } 
    } 
    //entry not found 
    else 
     hRes = 0; 
    return hRes; 
} 

uint64_t nFromImsi = 1; 
uint64_t nToImsi = 1; 
m_multiParam.ModifyKeyBy<IMSI_tag,IMSI_tag>(nFromImsi,nToImsi) 

하지만이

uint32_t nFromImsi = 1; 
uint32_t nToImsi = 1; 
m_multiParam.ModifyKeyBy<IMEI_tag,IMEI_tag>(nFromImsi,nToImsi) 
컴파일 도우미 함수를 사용

template <typename TagType,typename SearchingKey> 
typename GlobalHash::index<TagType>::type::iterator GetIteratorBy(SearchingKey & key){ 
    return m_pGlobalHash->get<TagType>().find(key) ; 
} 

및 수정 기능이

왜? 그리고 여기

를 컴파일 할 수있는 방법 수식은

template <> inline void CrMultiParameterMultiIndex::ModifyKey<IMEI_tag>(uint32_t & po_Key){po_Key = m_ParameterKeys.IMEI;} 
template <> inline void CrMultiParameterMultiIndex::ModifyKey<IMSI_tag>(uint64_t & po_Key){po_Key = m_ParameterKeys.IMSI;} 

답변

2

데이비드,

m_pGlobalHash 인덱스 # 0에보기 사실에

if(m_pGlobalHash->modify_key(itToModify , f)==false) 

거짓말의 문제입니다 (order_by_IMSI)보기 # 1에 대한 반복자를 허용하지 않습니다 (order_by_IMEI). project iterators 또는 적절한 색인을 선택할 수 있습니다.

if(m_pGlobalHash->get<ModifyingTagType>().modify_key(itToModify , f)==false) 
+0

답을 보내 주셔서 감사합니다. 회원을 통해/modify_key를 수정하려면 매개 변수를 전달해야합니까? – davidbobo

+0

[coliru] (http://coliru.stacked-crooked.com/a/4586d3c48d1b4a55) –

+0

죄송합니다. "회원을 통해"매개 변수를 전달하는 것에 대해 궁금한 점이 있습니까? –