Я пытаюсь использовать оператор скобки на 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
что отвечает моим требованиям и поддерживает брекет-оператор?
Как всегда, мы ссылаемся на документация:
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
Других решений пока нет …