Ошибка компиляции шаблона multi_index

2 вопроса:
1. Мне действительно нужно передать параметр для изменения / modify_key через член?
2. Почему у меня есть эта ошибка компиляции

Чтобы увидеть весь код с ошибкой, вы можете посмотреть на 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 TagType,typename SearchingKey>
typename GlobalHash::index<TagType>::type::iterator GetIteratorBy(SearchingKey & key){
return  m_pGlobalHash->get<TagType>().find(key) ;
}

и измените функцию, которая его использует

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 <> 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;}

0

Решение

Дэвид,

Проблема с

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

заключается в том, что m_pGlobalHashэто вид на индекс № 0 (order_by_IMSI) и не принимает итераторы для просмотра # 1 (order_by_IMEI). Вы также можете итераторы проекта или выберите соответствующий индекс:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]