c++ - 如何在 boost::multi_index::multi_index_container 中存储元素?

标签 c++ boost boost-multi-index

我想使用boost的多索引容器。为了使用它,我尝试了以下示例程序来了解容器中元素的插入。

以下是我的代码:

#include <string>
#include <boost/multi_index_container.hpp>
#include "boost/multi_index/global_fun.hpp"
#include "boost/multi_index/hashed_index.hpp"
#include <boost/multi_index/sequenced_index.hpp>
#include "boost/multi_index/mem_fun.hpp"
#include "boost/multi_index/member.hpp"
#include "boost/multi_index/ordered_index.hpp"

using namespace std;

class uri
{
  public:
        string str;
        uri(string s):str(s)
        {
        }
        string getUri(){ return str; }

};


struct UriWithBase
{
  UriWithBase(uri u1, uri u2):link(u1), baseLink(u2){}
  uri link;
  uri baseLink;
};



int main()
{
  typedef boost::multi_index::multi_index_container<
     UriWithBase*,
     boost::multi_index::indexed_by<
        boost::multi_index::sequenced<>
     > 
 > UriMultiIndex;

  UriMultiIndex m_uris;

  uri urib1("www.google.com");
  uri uri1("www.news.google.com");

  UriWithBase *ubptr = new UriWithBase(uri1, urib1);

  m_uris.insert(ubptr);
  return 0;
}

但是,当我编译以下内容时,它显示以下错误:

main.cc: In function `int main()':
main.cc:67: error: no matching function for call to `boost::multi_index::multi_index_container<UriWithBase*, boost::multi_index::indexed_by<boost::multi_index::sequenced<boost::multi_index::tag<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::allocator<UriWithBase*> >::insert(UriWithBase*&)'

../include/boost/multi_index/sequenced_index.hpp:304: note: candidates are: std::pair<boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::sequenced_index_node<typename SuperMeta::type::node_type> >, bool> boost::multi_index::detail::sequenced_index<SuperMeta, TagList>::insert(boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::sequenced_index_node<typename SuperMeta::type::node_type> >, const typename boost::multi_index::detail::sequenced_index_node<typename SuperMeta::type::node_type>::value_type&) [with SuperMeta = boost::multi_index::detail::nth_layer<1, UriWithBase*, boost::multi_index::indexed_by<boost::multi_index::sequenced<boost::multi_index::tag<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::allocator<UriWithBase*> >, TagList = boost::mpl::vector0<mpl_::na>]
    ../include/boost/multi_index/sequenced_index.hpp:316: note:                 std::pair<boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::sequenced_index_node<typename SuperMeta::type::node_type> >, bool> boost::multi_index::detail::sequenced_index<SuperMeta, TagList>::insert(boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::sequenced_index_node<typename SuperMeta::type::node_type> >, boost::rv<typename boost::multi_index::detail::sequenced_index_node<typename SuperMeta::type::node_type>::value_type>&) [with SuperMeta = boost::multi_index::detail::nth_layer<1, UriWithBase*, boost::multi_index::indexed_by<boost::multi_index::sequenced<boost::multi_index::tag<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::allocator<UriWithBase*> >, TagList = boost::mpl::vector0<mpl_::na>]
    ../include/boost/multi_index/sequenced_index.hpp:328: note:                 void boost::multi_index::detail::sequenced_index<SuperMeta, TagList>::insert(boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::sequenced_index_node<typename SuperMeta::type::node_type> >, size_t, typename boost::call_traits<typename boost::multi_index::detail::sequenced_index_node<typename SuperMeta::type::node_type>::value_type>::param_type) [with SuperMeta = boost::multi_index::detail::nth_layer<1, UriWithBase*, boost::multi_index::indexed_by<boost::multi_index::sequenced<boost::multi_index::tag<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::allocator<UriWithBase*> >, TagList = boost::mpl::vector0<mpl_::na>]

有解决此错误的指针吗?

最佳答案

documentation

The interface of sequenced indices is thus designed upon that of std::list; nearly every operation provided in the standard container is replicated here...

因此,insert 方法需要两个参数。使用 push_backpush_front 方法需要一个参数 - 对值的引用。下面是可编译的代码

#include <string>
#include <boost/multi_index_container.hpp>
#include "boost/multi_index/global_fun.hpp"
#include "boost/multi_index/hashed_index.hpp"
#include <boost/multi_index/sequenced_index.hpp>
#include "boost/multi_index/mem_fun.hpp"
#include "boost/multi_index/member.hpp"
#include "boost/multi_index/ordered_index.hpp"
#include "boost/multi_index/indexed_by.hpp"

using namespace std;

class uri
{
public:
    string str;
    uri(string s) :str(s)
    {
    }
    string getUri(){ return str; }

};


struct UriWithBase
{
    UriWithBase(uri u1, uri u2) :link(u1), baseLink(u2){}
    uri link;
    uri baseLink;
};



int main()
{
    typedef boost::multi_index::multi_index_container <
        UriWithBase*,
        boost::multi_index::indexed_by <
        boost::multi_index::sequenced < >
        >
    > UriMultiIndex;

    UriMultiIndex m_uris;

    uri urib1("www.google.com");
    uri uri1("www.news.google.com");

    UriWithBase *ubptr = new UriWithBase(uri1, urib1);

    m_uris.push_back(ubptr);
    return 0;
}

关于c++ - 如何在 boost::multi_index::multi_index_container 中存储元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29230645/

相关文章:

c++在没有 vector 的情况下实时分配内存

C++ 程序报告找不到符号错误

c++ - 如何使用 Boost.Filesystem 检查两个路径是否指向同一个文件/目录

boost - 如何使用 listS 作为顶点容器为 boost 图创建 PropertyMap?

c++ - 在 Boost 中同步线程

c++ - 在没有迭代器的情况下访问 boost 多索引容器

c++ - 是否有从另一个 namespace 内部定义成员的解决方法?

c++ - 如何利用标准库

c++ - boost.multi_index : iterate over an index in reverse order

c++ - boost 多索引私有(private)成员访问