Reputation: 11727
I want to use multi index container of boost. To use it I tried following sample program to understand the insertion of elements in the container.
Following is my code :
#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;
}
However when I compiled the following it shows following error:
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>]
Any pointer to resolve this error?
Upvotes: 2
Views: 531
Reputation: 8650
The documentation says
The interface of sequenced indices is thus designed upon that of std::list; nearly every operation provided in the standard container is replicated here...
Thus the insert
method requires two parameters. Using the push_back
and push_front
methods required one parameter - a reference to the value. Below is the compilable code
#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;
}
Upvotes: 1
Reputation: 392903
You need an insertion hint here:
m_uris.insert(m_uris.end(), ubptr);
Oh, and here's a pointer: nullptr
:)
Upvotes: 1