Использование boost::icl::interval_map с std::shared_ptr
Я хотел бы использовать общие указатели с boost::icl::interval_map
что-то похожее на следующее:
namespace icl = boost::icl;
icl::interval_map<int, std::shared_ptr<const std::string>> party;
const auto mary = std::make_shared<const std::string>("Mary");
party += make_pair(icl::interval<int>::right_open(10, 16), mary);
std::shared_ptr
на самом деле указывает на абстрактный класс (не std::string
как в примере), на который нужно ссылаться через указатель (отсюда и проблема).
Ниже приведены некоторые ошибки компилятора, приведенные выше. Похоже, что вывод шаблона не удается, но мне не ясно, какую из многих перегрузок должен использовать компилятор. Может кто-нибудь, более знакомый с ICL (или читающий эти ошибки), объяснить, что происходит на английском языке?
Scanning dependencies of target SourceFile
[100%] Building CXX object SourceFile.cpp.o
In file included from /ext-lib/include/boost/icl/map.hpp:38:0,
from /ext-lib/include/boost/icl/interval_base_map.hpp:25,
from /ext-lib/include/boost/icl/interval_map.hpp:14,
from /home/user/SourceFile.cpp:1:
/ext-lib/include/boost/icl/functors.hpp: In instantiation of ‘void boost::icl::inplace_plus<Type>::operator()(Type&, const Type&) const [with Type = std::shared_ptr<const std::__cxx11::basic_string<char> >]’:
/ext-lib/include/boost/icl/interval_base_map.hpp:898:19: required from ‘void boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::add_rear(const interval_type&, const CodomainT&, boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::iterator&) [with Combiner = boost::icl::inplace_plus<std::shared_ptr<const std::__cxx11::basic_string<char> > >; SubType = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >; DomainT = int; CodomainT = std::shared_ptr<const std::__cxx11::basic_string<char> >; Traits = boost::icl::partial_absorber; Compare = std::less; Combine = boost::icl::inplace_plus; Section = boost::icl::inter_section; Interval = boost::icl::discrete_interval<int, std::less>; Alloc = std::allocator; boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::interval_type = boost::icl::discrete_interval<int, std::less>; boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const boost::icl::discrete_interval<int, std::less>, std::shared_ptr<const std::__cxx11::basic_string<char> > > >]’
/ext-lib/include/boost/icl/interval_base_map.hpp:968:27: required from ‘boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::iterator boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::_add(const segment_type&) [with Combiner = boost::icl::inplace_plus<std::shared_ptr<const std::__cxx11::basic_string<char> > >; SubType = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >; DomainT = int; CodomainT = std::shared_ptr<const std::__cxx11::basic_string<char> >; Traits = boost::icl::partial_absorber; Compare = std::less; Combine = boost::icl::inplace_plus; Section = boost::icl::inter_section; Interval = boost::icl::discrete_interval<int, std::less>; Alloc = std::allocator; boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const boost::icl::discrete_interval<int, std::less>, std::shared_ptr<const std::__cxx11::basic_string<char> > > >; boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::segment_type = std::pair<boost::icl::discrete_interval<int, std::less>, std::shared_ptr<const std::__cxx11::basic_string<char> > >]’
/ext-lib/include/boost/icl/interval_base_map.hpp:315:9: required from ‘SubType& boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::add(const segment_type&) [with SubType = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >; DomainT = int; CodomainT = std::shared_ptr<const std::__cxx11::basic_string<char> >; Traits = boost::icl::partial_absorber; Compare = std::less; Combine = boost::icl::inplace_plus; Section = boost::icl::inter_section; Interval = boost::icl::discrete_interval<int, std::less>; Alloc = std::allocator; boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::segment_type = std::pair<boost::icl::discrete_interval<int, std::less>, std::shared_ptr<const std::__cxx11::basic_string<char> > >]’
/ext-lib/include/boost/icl/concept/interval_map.hpp:149:30: required from ‘typename boost::enable_if<boost::icl::is_interval_map<Type>, Type>::type& boost::icl::add(Type&, const typename Type::segment_type&) [with Type = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >; typename boost::enable_if<boost::icl::is_interval_map<Type>, Type>::type = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >; typename Type::segment_type = std::pair<boost::icl::discrete_interval<int, std::less>, std::shared_ptr<const std::__cxx11::basic_string<char> > >]’
/ext-lib/include/boost/icl/concept/interval_associator.hpp:305:20: required from ‘typename boost::enable_if<boost::icl::is_intra_derivative<Type, AssociateT>, Type>::type& boost::icl::operator+=(Type&, const OperandT&) [with Type = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >; OperandT = std::pair<boost::icl::discrete_interval<int, std::less>, std::shared_ptr<const std::__cxx11::basic_string<char> > >; typename boost::enable_if<boost::icl::is_intra_derivative<Type, AssociateT>, Type>::type = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >]’
/home/user/SourceFile.cpp:96:68: required from here
/ext-lib/include/boost/icl/functors.hpp:73:18: error: no match for ‘operator+=’ (operand types are ‘std::shared_ptr<const std::__cxx11::basic_string<char> >’ and ‘const std::shared_ptr<const std::__cxx11::basic_string<char> >’)
{ object += operand; }
~~~~~~~^~~~~~~~~~
In file included from /ext-lib/include/boost/icl/associative_interval_container.hpp:18:0,
from /ext-lib/include/boost/icl/interval_base_set.hpp:24,
from /ext-lib/include/boost/icl/interval_set.hpp:14,
from /ext-lib/include/boost/icl/interval_map.hpp:13,
from /home/user/SourceFile.cpp:1:
/ext-lib/include/boost/icl/concept/interval_associator.hpp:303:1: note: candidate: template<class Type, class OperandT> typename boost::enable_if<boost::icl::is_intra_derivative<Type, AssociateT>, Type>::type& boost::icl::operator+=(Type&, const OperandT&)
operator += (Type& object, const OperandT& operand)
^~~~~~~~
/ext-lib/include/boost/icl/concept/interval_associator.hpp:303:1: note: template argument deduction/substitution failed:
/ext-lib/include/boost/icl/concept/interval_associator.hpp: In substitution of ‘template<class Type, class OperandT> typename boost::enable_if<boost::icl::is_intra_derivative<Type, AssociateT>, Type>::type& boost::icl::operator+=(Type&, const OperandT&) [with Type = std::shared_ptr<const std::__cxx11::basic_string<char> >; OperandT = std::shared_ptr<const std::__cxx11::basic_string<char> >]’:
/ext-lib/include/boost/icl/functors.hpp:73:18: required from ‘void boost::icl::inplace_plus<Type>::operator()(Type&, const Type&) const [with Type = std::shared_ptr<const std::__cxx11::basic_string<char> >]’
/ext-lib/include/boost/icl/interval_base_map.hpp:898:19: required from ‘void boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::add_rear(const interval_type&, const CodomainT&, boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::iterator&) [with Combiner = boost::icl::inplace_plus<std::shared_ptr<const std::__cxx11::basic_string<char> > >; SubType = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >; DomainT = int; CodomainT = std::shared_ptr<const std::__cxx11::basic_string<char> >; Traits = boost::icl::partial_absorber; Compare = std::less; Combine = boost::icl::inplace_plus; Section = boost::icl::inter_section; Interval = boost::icl::discrete_interval<int, std::less>; Alloc = std::allocator; boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::interval_type = boost::icl::discrete_interval<int, std::less>; boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const boost::icl::discrete_interval<int, std::less>, std::shared_ptr<const std::__cxx11::basic_string<char> > > >]’
/ext-lib/include/boost/icl/interval_base_map.hpp:968:27: required from ‘boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::iterator boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::_add(const segment_type&) [with Combiner = boost::icl::inplace_plus<std::shared_ptr<const std::__cxx11::basic_string<char> > >; SubType = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >; DomainT = int; CodomainT = std::shared_ptr<const std::__cxx11::basic_string<char> >; Traits = boost::icl::partial_absorber; Compare = std::less; Combine = boost::icl::inplace_plus; Section = boost::icl::inter_section; Interval = boost::icl::discrete_interval<int, std::less>; Alloc = std::allocator; boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const boost::icl::discrete_interval<int, std::less>, std::shared_ptr<const std::__cxx11::basic_string<char> > > >; boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::segment_type = std::pair<boost::icl::discrete_interval<int, std::less>, std::shared_ptr<const std::__cxx11::basic_string<char> > >]’
/ext-lib/include/boost/icl/interval_base_map.hpp:315:9: required from ‘SubType& boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::add(const segment_type&) [with SubType = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >; DomainT = int; CodomainT = std::shared_ptr<const std::__cxx11::basic_string<char> >; Traits = boost::icl::partial_absorber; Compare = std::less; Combine = boost::icl::inplace_plus; Section = boost::icl::inter_section; Interval = boost::icl::discrete_interval<int, std::less>; Alloc = std::allocator; boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::segment_type = std::pair<boost::icl::discrete_interval<int, std::less>, std::shared_ptr<const std::__cxx11::basic_string<char> > >]’
/ext-lib/include/boost/icl/concept/interval_map.hpp:149:30: required from ‘typename boost::enable_if<boost::icl::is_interval_map<Type>, Type>::type& boost::icl::add(Type&, const typename Type::segment_type&) [with Type = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >; typename boost::enable_if<boost::icl::is_interval_map<Type>, Type>::type = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >; typename Type::segment_type = std::pair<boost::icl::discrete_interval<int, std::less>, std::shared_ptr<const std::__cxx11::basic_string<char> > >]’
/ext-lib/include/boost/icl/concept/interval_associator.hpp:305:20: required from ‘typename boost::enable_if<boost::icl::is_intra_derivative<Type, AssociateT>, Type>::type& boost::icl::operator+=(Type&, const OperandT&) [with Type = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >; OperandT = std::pair<boost::icl::discrete_interval<int, std::less>, std::shared_ptr<const std::__cxx11::basic_string<char> > >; typename boost::enable_if<boost::icl::is_intra_derivative<Type, AssociateT>, Type>::type = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >]’
/home/user/SourceFile.cpp:96:68: required from here
/ext-lib/include/boost/icl/concept/interval_associator.hpp:303:1: error: no type named ‘type’ in ‘struct boost::enable_if<boost::icl::is_intra_derivative<std::shared_ptr<const std::__cxx11::basic_string<char> >, std::shared_ptr<const std::__cxx11::basic_string<char> > >, std::shared_ptr<const std::__cxx11::basic_string<char> > >’
In file included from /ext-lib/include/boost/icl/associative_interval_container.hpp:18:0,
from /ext-lib/include/boost/icl/interval_base_set.hpp:24,
from /ext-lib/include/boost/icl/interval_set.hpp:14,
from /ext-lib/include/boost/icl/interval_map.hpp:13,
from /home/user/SourceFile.cpp:1:
/ext-lib/include/boost/icl/functors.hpp: In instantiation of ‘void boost::icl::inplace_plus<Type>::operator()(Type&, const Type&) const [with Type = std::shared_ptr<const std::__cxx11::basic_string<char> >]’:
/ext-lib/include/boost/icl/interval_base_map.hpp:898:19: required from ‘void boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::add_rear(const interval_type&, const CodomainT&, boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::iterator&) [with Combiner = boost::icl::inplace_plus<std::shared_ptr<const std::__cxx11::basic_string<char> > >; SubType = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >; DomainT = int; CodomainT = std::shared_ptr<const std::__cxx11::basic_string<char> >; Traits = boost::icl::partial_absorber; Compare = std::less; Combine = boost::icl::inplace_plus; Section = boost::icl::inter_section; Interval = boost::icl::discrete_interval<int, std::less>; Alloc = std::allocator; boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::interval_type = boost::icl::discrete_interval<int, std::less>; boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const boost::icl::discrete_interval<int, std::less>, std::shared_ptr<const std::__cxx11::basic_string<char> > > >]’
/ext-lib/include/boost/icl/interval_base_map.hpp:968:27: required from ‘boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::iterator boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::_add(const segment_type&) [with Combiner = boost::icl::inplace_plus<std::shared_ptr<const std::__cxx11::basic_string<char> > >; SubType = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >; DomainT = int; CodomainT = std::shared_ptr<const std::__cxx11::basic_string<char> >; Traits = boost::icl::partial_absorber; Compare = std::less; Combine = boost::icl::inplace_plus; Section = boost::icl::inter_section; Interval = boost::icl::discrete_interval<int, std::less>; Alloc = std::allocator; boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const boost::icl::discrete_interval<int, std::less>, std::shared_ptr<const std::__cxx11::basic_string<char> > > >; boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::segment_type = std::pair<boost::icl::discrete_interval<int, std::less>, std::shared_ptr<const std::__cxx11::basic_string<char> > >]’
/ext-lib/include/boost/icl/interval_base_map.hpp:315:9: required from ‘SubType& boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::add(const segment_type&) [with SubType = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >; DomainT = int; CodomainT = std::shared_ptr<const std::__cxx11::basic_string<char> >; Traits = boost::icl::partial_absorber; Compare = std::less; Combine = boost::icl::inplace_plus; Section = boost::icl::inter_section; Interval = boost::icl::discrete_interval<int, std::less>; Alloc = std::allocator; boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::segment_type = std::pair<boost::icl::discrete_interval<int, std::less>, std::shared_ptr<const std::__cxx11::basic_string<char> > >]’
/ext-lib/include/boost/icl/concept/interval_map.hpp:149:30: required from ‘typename boost::enable_if<boost::icl::is_interval_map<Type>, Type>::type& boost::icl::add(Type&, const typename Type::segment_type&) [with Type = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >; typename boost::enable_if<boost::icl::is_interval_map<Type>, Type>::type = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >; typename Type::segment_type = std::pair<boost::icl::discrete_interval<int, std::less>, std::shared_ptr<const std::__cxx11::basic_string<char> > >]’
/ext-lib/include/boost/icl/concept/interval_associator.hpp:305:20: required from ‘typename boost::enable_if<boost::icl::is_intra_derivative<Type, AssociateT>, Type>::type& boost::icl::operator+=(Type&, const OperandT&) [with Type = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >; OperandT = std::pair<boost::icl::discrete_interval<int, std::less>, std::shared_ptr<const std::__cxx11::basic_string<char> > >; typename boost::enable_if<boost::icl::is_intra_derivative<Type, AssociateT>, Type>::type = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >]’
/home/user/SourceFile.cpp:96:68: required from here
/ext-lib/include/boost/icl/concept/interval_associator.hpp:318:1: note: candidate: template<class Type, class OperandT> typename boost::enable_if<boost::icl::is_intra_combinable<LeftT, RightT>, Type>::type& boost::icl::operator+=(Type&, const OperandT&)
operator += (Type& object, const OperandT& operand)
^~~~~~~~
... more "template argument deduction/substitution failed" errors ...
/ext-lib/include/boost/icl/concept/element_associator.hpp:192:1: note: template argument deduction/substitution failed:
/ext-lib/include/boost/icl/concept/element_associator.hpp: In substitution of ‘template<class Type> typename boost::enable_if<boost::icl::is_associative_element_container<Type>, Type>::type& boost::icl::operator+=(Type&, const Type&) [with Type = std::shared_ptr<const std::__cxx11::basic_string<char> >]’:
/ext-lib/include/boost/icl/functors.hpp:73:18: required from ‘void boost::icl::inplace_plus<Type>::operator()(Type&, const Type&) const [with Type = std::shared_ptr<const std::__cxx11::basic_string<char> >]’
/ext-lib/include/boost/icl/interval_base_map.hpp:898:19: required from ‘void boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::add_rear(const interval_type&, const CodomainT&, boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::iterator&) [with Combiner = boost::icl::inplace_plus<std::shared_ptr<const std::__cxx11::basic_string<char> > >; SubType = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >; DomainT = int; CodomainT = std::shared_ptr<const std::__cxx11::basic_string<char> >; Traits = boost::icl::partial_absorber; Compare = std::less; Combine = boost::icl::inplace_plus; Section = boost::icl::inter_section; Interval = boost::icl::discrete_interval<int, std::less>; Alloc = std::allocator; boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::interval_type = boost::icl::discrete_interval<int, std::less>; boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const boost::icl::discrete_interval<int, std::less>, std::shared_ptr<const std::__cxx11::basic_string<char> > > >]’
/ext-lib/include/boost/icl/interval_base_map.hpp:968:27: required from ‘boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::iterator boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::_add(const segment_type&) [with Combiner = boost::icl::inplace_plus<std::shared_ptr<const std::__cxx11::basic_string<char> > >; SubType = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >; DomainT = int; CodomainT = std::shared_ptr<const std::__cxx11::basic_string<char> >; Traits = boost::icl::partial_absorber; Compare = std::less; Combine = boost::icl::inplace_plus; Section = boost::icl::inter_section; Interval = boost::icl::discrete_interval<int, std::less>; Alloc = std::allocator; boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const boost::icl::discrete_interval<int, std::less>, std::shared_ptr<const std::__cxx11::basic_string<char> > > >; boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::segment_type = std::pair<boost::icl::discrete_interval<int, std::less>, std::shared_ptr<const std::__cxx11::basic_string<char> > >]’
/ext-lib/include/boost/icl/interval_base_map.hpp:315:9: required from ‘SubType& boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::add(const segment_type&) [with SubType = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >; DomainT = int; CodomainT = std::shared_ptr<const std::__cxx11::basic_string<char> >; Traits = boost::icl::partial_absorber; Compare = std::less; Combine = boost::icl::inplace_plus; Section = boost::icl::inter_section; Interval = boost::icl::discrete_interval<int, std::less>; Alloc = std::allocator; boost::icl::interval_base_map<SubType, DomainT, CodomainT, Traits, Compare, Combine, Section, Interval, Alloc>::segment_type = std::pair<boost::icl::discrete_interval<int, std::less>, std::shared_ptr<const std::__cxx11::basic_string<char> > >]’
/ext-lib/include/boost/icl/concept/interval_map.hpp:149:30: required from ‘typename boost::enable_if<boost::icl::is_interval_map<Type>, Type>::type& boost::icl::add(Type&, const typename Type::segment_type&) [with Type = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >; typename boost::enable_if<boost::icl::is_interval_map<Type>, Type>::type = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >; typename Type::segment_type = std::pair<boost::icl::discrete_interval<int, std::less>, std::shared_ptr<const std::__cxx11::basic_string<char> > >]’
/ext-lib/include/boost/icl/concept/interval_associator.hpp:305:20: required from ‘typename boost::enable_if<boost::icl::is_intra_derivative<Type, AssociateT>, Type>::type& boost::icl::operator+=(Type&, const OperandT&) [with Type = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >; OperandT = std::pair<boost::icl::discrete_interval<int, std::less>, std::shared_ptr<const std::__cxx11::basic_string<char> > >; typename boost::enable_if<boost::icl::is_intra_derivative<Type, AssociateT>, Type>::type = boost::icl::interval_map<int, std::shared_ptr<const std::__cxx11::basic_string<char> > >]’
/home/user/SourceFile.cpp:96:68: required from here
/ext-lib/include/boost/icl/concept/element_associator.hpp:192:1: error: no type named ‘type’ in ‘struct boost::enable_if<boost::icl::is_associative_element_container<std::shared_ptr<const std::__cxx11::basic_string<char> > >, std::shared_ptr<const std::__cxx11::basic_string<char> > >’
1 ответ
В разделе "Агрегирование по перекрытию" в документации указывается, что сопоставляемый тип должен поддерживать объединение множеств.
Рабочая версия:
namespace icl = boost::icl;
using setOfPointers = std::set<std::shared_ptr<const std::string>>;
icl::interval_map<int, setOfPointers> party;
const auto mary = setOfPointers{std::make_shared<const std::string>("Mary")};
party += make_pair(icl::interval<int>::right_open(10, 16), mary);