我想使用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>]
任何解决此错误的指针?
答案 0 :(得分:0)
您需要在此处插入提示:
m_uris.insert(m_uris.end(), ubptr);
哦,这是一个指针:nullptr
:)
答案 1 :(得分:0)
因此设计了顺序索引的界面 的std ::列表;几乎每个标准容器中提供的操作 在这里复制......
因此insert
方法需要两个参数。使用push_back
和push_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;
}