[sword-devel] Multiple Feature entries from getConfigEntry().
Troy A. Griffitts
scribe at crosswire.org
Tue Jun 11 16:07:33 EDT 2024
Try changing your begin and end iterator types to const, e.g.
sword::ConfigEntMap::const_iterator
On June 11, 2024 21:34:52 GMT+02:00, "David "Judah's Shadow" Blue" <yudahsshadow at gmx.com> wrote:
>On Monday, May 20, 2024 2:37:07 PM EDT David "Judah's Shadow" Blue wrote:
>> On Wednesday, May 15, 2024 9:01:14 AM EDT Troy A. Griffitts wrote:
>> > Hi David,
>> >
>> > Yeah, so a module's config is simply a multimap<SWBuf, SWBuf>. We
>> > extend multimap with our own class multimapwithdefault to make it nice
>> >
>> > to work with when there is only one entry so you can still simply say:
>> > SWBuf x = configEntries["mykey"];
>> >
>> > Just like a map works, but if there is more than one entry, for your key
>> > (which is allowed by multimap) the behavior is undefined. You'll get
>> > one of the entries, but not sure which one.
>> >
>> > So, for cases when you want to read multiple entries for a key, you'll
>> >
>> > have to use the standard multimap iterators, something like the
>> > following:
>> > ConfigEntMap::iterator begin =
>> >
>> > module->getConfig().lower_bound("Feature");
>> >
>> > ConfigEntMap::iterator end =
>> >
>> > module->getConfig().upper_bound("Feature");
>> >
>> > while (begin != end) {
>> >
>> > SWBuf featureValue = begin->second;
>> > ++begin;
>> >
>> > }
>> >
>> > Hope this helps,
>>
>> It does, however, when I try this I get errors about no viable overloaded
>> '='. I've tried both declaring my ConfigEntMap::iterators before hand and
>> assigning them in the declaration, the errors differ slightly, but it all
>> boils down to the compiler not being able to decide if it should be an
>> implicit copy or an implicit move. I assume it should be a copy, but I'm
>> not sure how to go about specifying that in the code.
>
>I've still not managed to get any headway on getting this to compile. Here's
>my code:
>
>If(this->mod->getConfigEntry("Feature") != NULL) {
> sword::ConfigEntMap::iterator begin;
> sword::ConfigEntMap::iterator end;
>
> begin = this->mod->getConfig().lower_bound("Feature");
> end = this->mod->getConfig().upper_bound("Feature");
>
> while(begin != end) {
> featureSet += "Feature: ";
> featureSet += begin->second;
> featureSet += "\n";
> ++begin;
> }
>}
>
>Where featureSet is a std::string.
>
>And this is the output of the compiler.
>[ 6%] Building CXX object CMakeFiles/bibish.dir/src/front/info.cpp.o
>~/Projects/bibish/src/front/info.cpp: In member function ‘std::string
>Info::getInfo()’:
>~/Projects/bibish/src/front/info.cpp:63:61: error: no match for ‘operator=’
>(operand types are ‘std::multimap<sword::SWBuf, sword::SWBuf,
>std::less<sword::SWBuf>, std::allocator<std::pair<const sword::SWBuf,
>sword::SWBuf> > >::iterator’ {aka ‘std::_Rb_tree<sword::SWBuf, std::pair<const
>sword::SWBuf, sword::SWBuf>, std::_Select1st<std::pair<const sword::SWBuf,
>sword::SWBuf> >, std::less<sword::SWBuf>, std::allocator<std::pair<const
>sword::SWBuf, sword::SWBuf> > >::iterator’} and ‘std::multimap<sword::SWBuf,
>sword::SWBuf, std::less<sword::SWBuf>, std::allocator<std::pair<const
>sword::SWBuf, sword::SWBuf> > >::const_iterator’ {aka
>‘std::_Rb_tree<sword::SWBuf, std::pair<const sword::SWBuf, sword::SWBuf>,
>std::_Select1st<std::pair<const sword::SWBuf, sword::SWBuf> >,
>std::less<sword::SWBuf>, std::allocator<std::pair<const sword::SWBuf,
>sword::SWBuf> > >::const_iterator’})
> 63 | begin = this->mod->getConfig().lower_bound("Feature");
> | ^
>In file included from /usr/include/c++/13/map:62,
> from /usr/include/sword/swmgr.h:60,
> from ~/Projects/bibish/src/front/info.cpp:25:
>/usr/include/c++/13/bits/stl_tree.h:256:12: note: candidate:
>‘std::_Rb_tree_iterator<std::pair<const sword::SWBuf, sword::SWBuf> >&
>std::_Rb_tree_iterator<std::pair<const sword::SWBuf, sword::SWBuf>
>>::operator=(const std::_Rb_tree_iterator<std::pair<const sword::SWBuf,
>sword::SWBuf> >&)’
> 256 | struct _Rb_tree_iterator
> | ^~~~~~~~~~~~~~~~~
>/usr/include/c++/13/bits/stl_tree.h:256:12: note: no known conversion for
>argument 1 from ‘std::multimap<sword::SWBuf, sword::SWBuf,
>std::less<sword::SWBuf>, std::allocator<std::pair<const sword::SWBuf,
>sword::SWBuf> > >::const_iterator’ {aka ‘std::_Rb_tree<sword::SWBuf,
>std::pair<const sword::SWBuf, sword::SWBuf>, std::_Select1st<std::pair<const
>sword::SWBuf, sword::SWBuf> >, std::less<sword::SWBuf>,
>std::allocator<std::pair<const sword::SWBuf, sword::SWBuf> >
>>::const_iterator’} to ‘const std::_Rb_tree_iterator<std::pair<const
>sword::SWBuf, sword::SWBuf> >&’
>/usr/include/c++/13/bits/stl_tree.h:256:12: note: candidate:
>‘std::_Rb_tree_iterator<std::pair<const sword::SWBuf, sword::SWBuf> >&
>std::_Rb_tree_iterator<std::pair<const sword::SWBuf, sword::SWBuf>
>>::operator=(std::_Rb_tree_iterator<std::pair<const sword::SWBuf,
>sword::SWBuf> >&&)’
>/usr/include/c++/13/bits/stl_tree.h:256:12: note: no known conversion for
>argument 1 from ‘std::multimap<sword::SWBuf, sword::SWBuf,
>std::less<sword::SWBuf>, std::allocator<std::pair<const sword::SWBuf,
>sword::SWBuf> > >::const_iterator’ {aka ‘std::_Rb_tree<sword::SWBuf,
>std::pair<const sword::SWBuf, sword::SWBuf>, std::_Select1st<std::pair<const
>sword::SWBuf, sword::SWBuf> >, std::less<sword::SWBuf>,
>std::allocator<std::pair<const sword::SWBuf, sword::SWBuf> >
>>::const_iterator’} to ‘std::_Rb_tree_iterator<std::pair<const sword::SWBuf,
>sword::SWBuf> >&&’
>~/Projects/bibish/src/front/info.cpp:64:59: error: no match for ‘operator=’
>(operand types are ‘std::multimap<sword::SWBuf, sword::SWBuf,
>std::less<sword::SWBuf>, std::allocator<std::pair<const sword::SWBuf,
>sword::SWBuf> > >::iterator’ {aka ‘std::_Rb_tree<sword::SWBuf, std::pair<const
>sword::SWBuf, sword::SWBuf>, std::_Select1st<std::pair<const sword::SWBuf,
>sword::SWBuf> >, std::less<sword::SWBuf>, std::allocator<std::pair<const
>sword::SWBuf, sword::SWBuf> > >::iterator’} and ‘std::multimap<sword::SWBuf,
>sword::SWBuf, std::less<sword::SWBuf>, std::allocator<std::pair<const
>sword::SWBuf, sword::SWBuf> > >::const_iterator’ {aka
>‘std::_Rb_tree<sword::SWBuf, std::pair<const sword::SWBuf, sword::SWBuf>,
>std::_Select1st<std::pair<const sword::SWBuf, sword::SWBuf> >,
>std::less<sword::SWBuf>, std::allocator<std::pair<const sword::SWBuf,
>sword::SWBuf> > >::const_iterator’})
> 64 | end = this->mod->getConfig().upper_bound("Feature");
> | ^
>/usr/include/c++/13/bits/stl_tree.h:256:12: note: candidate:
>‘std::_Rb_tree_iterator<std::pair<const sword::SWBuf, sword::SWBuf> >&
>std::_Rb_tree_iterator<std::pair<const sword::SWBuf, sword::SWBuf>
>>::operator=(const std::_Rb_tree_iterator<std::pair<const sword::SWBuf,
>sword::SWBuf> >&)’
> 256 | struct _Rb_tree_iterator
> | ^~~~~~~~~~~~~~~~~
>/usr/include/c++/13/bits/stl_tree.h:256:12: note: no known conversion for
>argument 1 from ‘std::multimap<sword::SWBuf, sword::SWBuf,
>std::less<sword::SWBuf>, std::allocator<std::pair<const sword::SWBuf,
>sword::SWBuf> > >::const_iterator’ {aka ‘std::_Rb_tree<sword::SWBuf,
>std::pair<const sword::SWBuf, sword::SWBuf>, std::_Select1st<std::pair<const
>sword::SWBuf, sword::SWBuf> >, std::less<sword::SWBuf>,
>std::allocator<std::pair<const sword::SWBuf, sword::SWBuf> >
>>::const_iterator’} to ‘const std::_Rb_tree_iterator<std::pair<const
>sword::SWBuf, sword::SWBuf> >&’
>/usr/include/c++/13/bits/stl_tree.h:256:12: note: candidate:
>‘std::_Rb_tree_iterator<std::pair<const sword::SWBuf, sword::SWBuf> >&
>std::_Rb_tree_iterator<std::pair<const sword::SWBuf, sword::SWBuf>
>>::operator=(std::_Rb_tree_iterator<std::pair<const sword::SWBuf,
>sword::SWBuf> >&&)’
>/usr/include/c++/13/bits/stl_tree.h:256:12: note: no known conversion for
>argument 1 from ‘std::multimap<sword::SWBuf, sword::SWBuf,
>std::less<sword::SWBuf>, std::allocator<std::pair<const sword::SWBuf,
>sword::SWBuf> > >::const_iterator’ {aka ‘std::_Rb_tree<sword::SWBuf,
>std::pair<const sword::SWBuf, sword::SWBuf>, std::_Select1st<std::pair<const
>sword::SWBuf, sword::SWBuf> >, std::less<sword::SWBuf>,
>std::allocator<std::pair<const sword::SWBuf, sword::SWBuf> >
>>::const_iterator’} to ‘std::_Rb_tree_iterator<std::pair<const sword::SWBuf,
>sword::SWBuf> >&&’
>make[2]: *** [CMakeFiles/bibish.dir/build.make:258: CMakeFiles/bibish.dir/src/
>front/info.cpp.o] Error 1
>make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/bibish.dir/all] Error 2
>make: *** [Makefile:136: all] Error 2
>
>
>
>
>_______________________________________________
>sword-devel mailing list: sword-devel at crosswire.org
>http://crosswire.org/mailman/listinfo/sword-devel
>Instructions to unsubscribe/change your settings at above page
--
Sent from my Android device with K-9 Mail. Please excuse my brevity.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://crosswire.org/pipermail/sword-devel/attachments/20240611/cd909041/attachment-0001.htm>
More information about the sword-devel
mailing list