Используйте этот синтаксис вместо вложенных 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;
Последняя ошибка: вы пытаетесь присвоить двум typedefs одно и то же имя: 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);
}