我需要创建一个包含multiindex容器作为存储的泛型类。当我编译时,它给出了如下定义第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;
private: conn_table_t conn_table_; };
{{1}}
答案 0 :(得分:11)
请使用此语法代替嵌套的typedef:
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
关键字作为distingush其他名称成员模板的限定符。
此外,此行无效:
typedef boost::shared_ptr conn_ptr_t;
您无法输入定义模板。您只能输入def类型。也许你打算写:
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)
,如文档here所述。
回复您的上一条评论:此代码段为我编译:
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);
}