关于c ++:模板参数来提升多索引容器

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;

这里使用typename关键字作为限定符,让编译器知道conn_table_t::template nth_index<0>::type是一种类型。只有在模板中才需要使用typename

这里使用template关键字作为限定符,用于区分成员模板与其他名称。

此外,此行无效:

1
typedef boost::shared_ptr conn_ptr_t;

不能使用typedef模板。只能使用typedef类型。也许你想写:

1
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)

作为对您上一条评论的回应:这段代码是为我编译的:

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);
}

其中fooconn_mgr模板内的成员函数。我猜以上就是你想做的。

您应该编写助手方法来获取对三个不同的conn_table_索引的引用。这会使事情变得更简洁。例如:

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);
}