параметр шаблона для увеличения многоиндексного контейнера - PullRequest
4 голосов
/ 10 марта 2011

Мне нужно создать универсальный класс, содержащий многоиндексный контейнер в качестве хранилища.при компиляции выдает ошибку, как показано ниже, где я определил n -ное представление индекса.

ошибка: не шаблон 'nth_index' используется в качестве шаблона


/**
 * connection manager
 */</p>

<p>template < typename T, typename C >
class conn_mgr: boost::noncopyable {
public:
    /**
     * connection ptr
     */
    typedef boost::shared_ptr conn_ptr_t;<br>
    /**
     * 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;</p>

<pre>//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;

private: conn_table_t conn_table_;};

</p>

<p>and here how I am using in main.</p>

<p>int main( int argc, char** argv )
{
   typedef conn_mgr < smpp_conn, smpp_config > smpp_conn_mgr_t;
   smpp_conn_mgr_t conn_mgr;
}</p>

<p>

1 Ответ

11 голосов
/ 10 марта 2011

Используйте этот синтаксис вместо вложенных 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);
}
...