OPERATOR_BRACKET_IS_NOT_SUPPORTED для boost::bimap

Я пытаюсь использовать оператор скобки на boost::bimap но без успеха.

Для решения проблемы, которую я стремлюсь, мне нужна bimap который удовлетворяет следующему требованию:

  • отсортированный, уникальныйint
  • правильный не уникальный, не отсортированный тип

Это привело меня к выбору следующегоtypedefдля меняbimap,

typedef bimap<int, multiset_of<int> > bm;

Я хочу использовать оператор скобки для этого типа, но безуспешно. Это код, который я использую,

#include <iostream>
#include <boost/bimap/bimap.hpp>
#include <boost/bimap/multiset_of.hpp>

using namespace std;
using namespace boost::bimaps;

int main()
{
    typedef bimap<int, multiset_of<int> > bm;
    bm mapping;

    mapping.insert(bm::value_type(1, 1));
    mapping.insert(bm::value_type(2, 1));
    mapping.insert(bm::value_type(3, 4));

    for (auto it : {1 , 2, 3})
        mapping.left[it] = it;

    for (auto it : mapping.left)
        cout << "{ " << it.first << ", " << it.second << " }  ";    

   return 0;
}

Это дает мне длинную ошибку компиляции, где важный бит, кажется,

/usr/include/boost/bimap/detail/map_view_base.hpp:351:9: error: no matching function for call to 'assertion_failed'
        BOOST_BIMAP_STATIC_ERROR( OPERATOR_BRACKET_IS_NOT_SUPPORTED, (Derived));

(Пример полного живого видео и вывода компилятора можно найти на: rextester)

Я пробовал решение ниже, но оно по-прежнему выдает ошибки,

#include <iostream>
#include <boost/bimap/bimap.hpp>
#include <boost/bimap/multiset_of.hpp>

using namespace std;
using namespace boost::bimaps;

int main()
{
    typedef bimap<int, multiset_of<int> > bm;
    typedef bm::left_map map_type;
    bm mapping;

    map_type& m = mapping.left;

    mapping.insert(bm::value_type(1, 1));
    mapping.insert(bm::value_type(2, 1));
    mapping.insert(bm::value_type(3, 4));

   for (auto it : {1 , 2, 3})
       m[it] = it;

    for (auto it : mapping.left)
        cout << "{ " << it.first << ", " << it.second << " }  ";    

   return 0;
}

Как я могу объявить bimap что отвечает моим требованиям и поддерживает брекет-оператор?

1 ответ

Решение

Как всегда, мы ссылаемся на документацию:

set_of и unordered_set_of отображают оператор перегрузки [] для извлечения связанных данных данного ключа только тогда, когда другой тип коллекции является изменяемым. В этих случаях он работает так же, как стандарт.

Вы используете неизменяемый тип на правой стороне:

Side collection type       Dereferenced data
--------------------------------------------
set_of                     constant
multiset_of                constant
unordered_set_of           constant
unordered_multiset_of      constant
list_of                    mutable
vector_of                  mutable
unconstrained_set_of       mutable

Итак, вы не можете использовать operator[],

Сообщение об ошибке говорит так же:

OPERATOR_BRACKET_IS_NOT_SUPPORTED
Другие вопросы по тегам