Параметр шаблона для увеличения многоиндексного контейнера
Мне нужно создать универсальный класс, содержащий многоиндексный контейнер в качестве хранилища. когда я компилирую, выдает ошибку, как показано ниже, где я определил n-е представление индекса.
ошибка: не шаблон 'nth_index' используется в качестве шаблона
/**
* connection manager
*/
template < typename T, typename C >
class conn_mgr: boost::noncopyable {
public:
/**
* connection ptr
*/
typedef boost::shared_ptr conn_ptr_t;
/**
* connection table type
* It's a multi index container
*/
typedef boost::multi_index::multi_index_container <
conn_ptr_t,
boost::multi_index::indexed_by <
//sequenced < >,
boost::multi_index::hashed_unique <
BOOST_MULTI_INDEX_CONST_MEM_FUN(T, std::string, T::id) >,
boost::multi_index::hashed_non_unique <
BOOST_MULTI_INDEX_CONST_MEM_FUN(T, std::string,
T::type)>,
boost::multi_index::hashed_non_unique <
boost::multi_index::composite_key < conn_ptr_t,
BOOST_MULTI_INDEX_CONST_MEM_FUN(T,
std::string, T::id),
BOOST_MULTI_INDEX_CONST_MEM_FUN(T,
std::string, T::type ) > > > >
conn_table_t;
//typedef for ConnectionIdView
typedef conn_table_t::nth_index<0>::type conn_table_by_id_type;
typedef conn_table_t::nth_index<1>::type conn_table_by_type;
typedef conn_table_t::nth_index<2>::type conn_table_by_id_type;
личное: conn_table_t conn_table_; };
а вот как я использую в основном.
int main (int argc, char ** argv) { typedef conn_mgr
smpp_conn_mgr_t; smpp_conn_mgr_t conn_mgr; }
1 ответ
Вместо этого используйте этот синтаксис для ваших вложенных typedefs:
typedef typename conn_table_t::template nth_index<0>::type conn_table_by_id_type;
typename
ключевое слово используется здесь как спецификатор, чтобы компилятор знал, что conn_table_t::template nth_index<0>::type
это тип. Это специальное использование typename
необходимо только в шаблонах.
template
Ключевое слово используется здесь в качестве квалификатора, чтобы отличить шаблоны членов от других имен.
Кроме того, эта строка недействительна:
typedef boost::shared_ptr conn_ptr_t;
Вы не можете печатать шаблоны. Вы можете печатать только определенные типы. Возможно, вы хотели написать:
typedef typename boost::shared_ptr<T> conn_ptr_t;
Последняя ошибка: вы пытаетесь присвоить двум typedef одинаковое имя: conn_table_by_id_type
Вы должны использовать BOOST_MULTI_INDEX_CONST_MEM_FUN(T, std::string, id)
вместо BOOST_MULTI_INDEX_CONST_MEM_FUN(T, std::string, T::id)
, как задокументировано здесь.
В ответ на ваш последний комментарий: Этот фрагмент для меня:
void foo(std::string id)
{
conn_table_by_id_type& id_type_view = conn_table_.template get<0>();
typename conn_table_by_id_type::const_iterator it = id_type_view.find(id);
}
куда foo
является функцией-членом внутри conn_mgr
шаблон. Я предполагаю, что вышеописанное - это то, что вы пытались сделать.
Вы должны написать вспомогательные методы, которые получают ссылки на ваши три разных conn_table_
индексы. Это сделает вещи намного более краткими. Например:
conn_table_by_id_type & by_id_type() {return conn_table_.template get<0>();}
void foo2(std::string id)
{
typename conn_table_by_id_type::const_iterator it = by_id_type().find(id);
}