template parameter to boost multi index container
我需要创建一个包含多索引容器的通用类作为存储。当我编译时,在我定义了第n个索引视图的地方,它给出了如下错误。
错误:非模板'nth_index'用作模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | /** * connection manager */ </p> <p> 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; </p> [cc lang="cpp"]//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; |
私人:连接桌};
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [cc lang="cpp"] </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> |
。
对嵌套的typedef使用此语法:
1 | typedef typename conn_table_t::template nth_index<0>::type conn_table_by_id_type; |
这里使用
这里使用
此外,此行无效:
1 | typedef boost::shared_ptr conn_ptr_t; |
不能使用typedef模板。只能使用typedef类型。也许你想写:
1 | typedef typename boost::shared_ptr<T> conn_ptr_t; |
最后一个错误:您试图给两个typedef赋予相同的名称:
如本文所述,您应该使用
作为对您上一条评论的回应:这段代码是为我编译的:
1 2 3 4 5 | 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); } |
其中
您应该编写助手方法来获取对三个不同的
1 2 3 4 5 6 | 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); } |