2015-03-24 4 views
2

Я хочу использовать контейнер с несколькими индексами. Чтобы использовать его, я попробовал следующую примерную программу, чтобы понять вставку элементов в контейнер.Как сохранить элементы в boost :: multi_index :: multi_index_container?

Ниже мой код:

#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

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_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; 
} 
+0

@ megabyte2014 благодарю вас за ответ, это сработало очень хорошо. Не могли бы вы рассказать мне, как объявлять typedef для проверки статуса вставки. Я пробовал следовать, но не работал typedef std :: pair :: type :: iterator, bool> InsertStatus; – BSalunke

+0

@BSalunke, это 'std :: pair prRes = m_uris.push_back (ubptr);', но я предпочитаю 'auto prRes = ....' – megabyte1024

+0

@ megabyte2014 Спасибо, что это сработало, однако Я обнаружил еще одну проблему :(Теперь я пытаюсь добавить еще один указатель индекса в контейнер с несколькими индексами, который добавляет элементы, однозначно упорядоченные для первого элемента класса «UriWithBase», то есть ссылки. Как спецификатор индекса, я пробовал следовать, но не работал boost :: multi_index :: ordered_unique , BOOST_MULTI_INDEX_CONST_MEM_FUN (UriWithBasePtr, const uri &, (* (UriWithBasePtr)).)> – BSalunke

0

Вам нужна установочная подсказка здесь:

m_uris.insert(m_uris.end(), ubptr); 

О, а вот указатель: nullptr :)

Смежные вопросы