2016-04-11 4 views
0

У меня возникли проблемы с созданием и сравнением обратных символов в наборе multi_index.Работа с boost :: multi_index reverse_iterators

namespace mi = boost::multi_index; 
typedef mi::multi_index_container< 
    size_t, 
    mi::indexed_by< 
    mi::ordered_non_unique<mi::identity<size_t>, IndexComparator >, 
    mi::hashed_unique<mi::identity<size_t> > 
    > 
> index_set_t; 

typedef index_set_t::nth_index<0>::type index_set_by_margin_t; 

void f() { 
    index_set_by_margin_t& margin_index = ordered_indexes.get<0>(); 
    index_set_by_margin_t::reverse_iterator it = 
     std::reverse_iterator<index_set_by_margin_t::iterator> 
     (margin_index.lower_bound(3, cmp)); 
} 

Это терпит неудачу в последней строке F, где я стараюсь, чтобы назначить обратный итератор, с довольно длинным сообщением об ошибке от г ++ 5.2.1:

error: conversion from ‘std::reverse_iterator<boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::hashed_index_node<boost::multi_index::detail::index_node_base<long unsigned int, std::allocator<long unsigned int> >, boost::multi_index::detail::hashed_unique_tag> > > >’ to non-scalar type ‘boost::multi_index::detail::ordered_index<boost::multi_index::identity<long unsigned int>, IndexComparator, boost::multi_index::detail::nth_layer<1, long unsigned int, boost::multi_index::indexed_by<boost::multi_index::ordered_non_unique<boost::multi_index::identity<long unsigned int>, IndexComparator>, boost::multi_index::hashed_unique<boost::multi_index::identity<long unsigned int> > >, std::allocator<long unsigned int> >, boost::mpl::vector0<mpl_::na>, boost::multi_index::detail::ordered_non_unique_tag>::reverse_iterator {aka boost::iterators::reverse_iterator<boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::hashed_index_node<boost::multi_index::detail::index_node_base<long unsigned int, std::allocator<long unsigned int> >, boost::multi_index::detail::hashed_unique_tag> > > >}’ requested 

Это, кажется, говорят, что std :: reverse_iterator не создает обратный_инитор правильного типа. Я попытался исправить это, изменив объявление типа «it» на auto, но он все еще терпит неудачу при попытке сравнить с margin_index.rend()

Есть ли какой-нибудь метод для создания обратного_итератора того же типа как margin_index.rend(), который также сохраняет логарифмическую сложность lower_bound?

+0

I [отформатирован сообщение об ошибке] (http://pastebin.com/dWKGGdem), чтобы сделать его более четким , Вы пытались использовать '#include ' и 'boost :: iterator :: reverse_iterator' вместо' std :: reverse_iterator'? (BTW, вы должны опубликовать пример кода, который будет полным и будет компилироваться, когда проблема будет решена - этого не будет, поскольку нет никаких включений и некоторых неопределенных символов, таких как 'IndexComparator' или' ordered_indexes') –

ответ

1

Не используйте std::reverse_iterator, не требуется:

index_set_by_margin_t::reverse_iterator it = 
    index_set_by_margin_t::reverse_iterator(margin_index.lower_bound(3, cmp)); 

или

index_set_by_margin_t::reverse_iterator it(margin_index.lower_bound(3, cmp)); 

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

  • Нет связанных вопросов^_^