multi_index_container and hash_key lookup with boost boost-1.33.1

Hi, I have a problem with a hash-index to a member of type std::vector<std::strings>. With boost 1.34 it compiles and runs find, but it fails to compile with 1.33! Unfortunately I do not have the luxury to change boost-version. Is there any way around this? I defined my multi_index_container like this: typedef std::vector<std::string> keys_type; struct entry_type { keys_type keys; bool operator<(const entry_type& e) const { ... } }; typedef boost::multi_index::multi_index_container< entry_type, mi::indexed_by< mi::hashed_unique< mi::tag<hash_index_tag>, mi::member<entry_type, keys_type, &entry_type::keys> >, mi::ordered_non_unique< mi::tag<pred_index_tag>, mi::identity<entry_type> >
mi_entries_type;
And get the following compile-error (see the bottom): /usr/bin/g++ -m64 -pipe -Wall -fPIC -O3 -DNDEBUG -I../framework -I/sitestat/src/nightly/2007-06-14/branches/rel-6-00/src/build/../../src/cgi -I/sitestat/src/nightly/2007-06-14/branches/rel-6-00/src/build/../../src/zip_utils -DBOOST_SP_USE_QUICK_ALLOCATOR -DBOOST_DISABLE_THREADS -m64 -pipe -Wall -fPIC -O3 -DNDEBUG -c refper_key.cpp -o release/refper_key.o refper_key.cpp: In member function virtual repgen::operator_base::error_code repgen::refper_key::do_pre_eval(): refper_key.cpp:391: warning: unused variable cols /usr/include/boost/functional/hash/hash.hpp: In static member function static size_t boost::hash_detail::call_hash<T>::call(const T&) [with T = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >]: /usr/include/boost/functional/hash/hash.hpp:315: instantiated from size_t boost::hash<T>::operator()(const T&) const [with T = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >] /usr/include/boost/multi_index/hashed_index.hpp:372: instantiated from boost::multi_index::detail::hashed_index_iterator<boost::multi_index::detail::hashed_index_node<typename SuperMeta::type::node_type>, boost::multi_index::detail::bucket_array<typename SuperMeta::type::final_allocator_type> > boost::multi_index::detail::hashed_index<KeyFromValue, Hash, Pred, SuperMeta, TagList, Category>::find(const CompatibleKey&, const CompatibleHash&, const CompatiblePred&) const [with CompatibleKey = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, CompatibleHash = boost::hash<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, CompatiblePred = std::equal_to<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, KeyFromValue = boost::multi_index::member<repgen::refper_types::entry_type, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, &repgen::refper_types::entry_type::keys>, Hash = boost::hash<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, Pred = std::equal_to<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, SuperMeta = boost::multi_index::detail::nth_layer<1, repgen::refper_types::entry_type, boost::multi_index::indexed_by<boost::multi_index::hashed_unique<boost::multi_index::tag<repgen::refper_types::hash_index_tag, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, boost::multi_index::member<repgen::refper_types::entry_type, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, &repgen::refper_types::entry_type::keys>, mpl_::na, mpl_::na>, boost::multi_index::ordered_non_unique<boost::multi_index::tag<repgen::refper_types::pred_index_tag, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, boost::multi_index::identity<repgen::refper_types::entry_type>, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::allocator<repgen::refper_types::entry_type> >, TagList = boost::mpl::v_item<repgen::refper_types::hash_index_tag, boost::mpl::vector0<mpl_::na>, 0>, Category = boost::multi_index::detail::hashed_unique_tag] /usr/include/boost/multi_index/hashed_index.hpp:362: instantiated from boost::multi_index::detail::hashed_index_iterator<boost::multi_index::detail::hashed_index_node<typename SuperMeta::type::node_type>, boost::multi_index::detail::bucket_array<typename SuperMeta::type::final_allocator_type> > boost::multi_index::detail::hashed_index<KeyFromValue, Hash, Pred, SuperMeta, TagList, Category>::find(const CompatibleKey&) const [with CompatibleKey = repgen::refper_types::keys_type, KeyFromValue = boost::multi_index::member<repgen::refper_types::entry_type, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, &repgen::refper_types::entry_type::keys>, Hash = boost::hash<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, Pred = std::equal_to<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, SuperMeta = boost::multi_index::detail::nth_layer<1, repgen::refper_types::entry_type, boost::multi_index::indexed_by<boost::multi_index::hashed_unique<boost::multi_index::tag<repgen::refper_types::hash_index_tag, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, boost::multi_index::member<repgen::refper_types::entry_type, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, &repgen::refper_types::entry_type::keys>, mpl_::na, mpl_::na>, boost::multi_index::ordered_non_unique<boost::multi_index::tag<repgen::refper_types::pred_index_tag, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, boost::multi_index::identity<repgen::refper_types::entry_type>, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::allocator<repgen::refper_types::entry_type> >, TagList = boost::mpl::v_item<repgen::refper_types::hash_index_tag, boost::mpl::vector0<mpl_::na>, 0>, Category = boost::multi_index::detail::hashed_unique_tag] refper_key.cpp:272: instantiated from here /usr/include/boost/functional/hash/hash.hpp:132: error: no matching function for call to hash_value(const std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&) /usr/include/boost/functional/hash/hash.hpp:89: note: candidates are: size_t boost::hash_value(int) /usr/include/boost/functional/hash/hash.hpp:94: note: size_t boost::hash_value(unsigned int) /usr/include/boost/functional/hash/hash.hpp:99: note: size_t boost::hash_value(long int) /usr/include/boost/functional/hash/hash.hpp:104: note: size_t boost::hash_value(long unsigned int) /usr/include/boost/functional/hash/hash.hpp:293: note: size_t boost::hash_value(float) /usr/include/boost/functional/hash/hash.hpp:298: note: size_t boost::hash_value(double) /usr/include/boost/functional/hash/hash.hpp:303: note: size_t boost::hash_value(long double) Thanks! Andrej ___________________________________________________________ Yahoo! Mail is the world's favourite email. Don't settle for less, sign up for your free account today http://uk.rd.yahoo.com/evt=44106/*http://uk.docs.yahoo.com/mail/winter07.htm...

----- Mensaje original ----- De: Andrej van der Zee <mavdzee@yahoo.co.uk> Fecha: Jueves, Junio 14, 2007 7:10 pm Asunto: [Boost-users] multi_index_container and hash_key lookup with boostboost-1.33.1 Para: Boost-users@lists.boost.org
Hi,
I have a problem with a hash-index to a member of type std::vector<std::strings>. With boost 1.34 it compiles and runs find, but it fails to compile with 1.33! [...] typedef std::vector<std::string> keys_type;
struct entry_type { keys_type keys;
bool operator<(const entry_type& e) const { ... } }; [...] error: no matching function for call to ?hash_value(const std::vector<...>&)? [...]
Hi Andrej, to teach the compiler to hash vectors you've got to include <boost/functional/hash/vector.hpp>. Starting from Boost 1.34, all the hash/*.hpp headers are deprecated and you should only use <boost/functional/hash.hpp>. Joaquín y López Muñoz Telefónica, Investigación y Desarrollo

Hi, Thanks again for your quick reply. Moreover, thanks a lot for this library! The strong point is that one can define multiple indexes on existing datastructures, without toughing the datastructures itself. For example, when you want to change a vector to a hash, its straightforward and less error-prone to use boost::multi_index_container, then rewriting your datastructures to key-value pairs and using an std::map. Cheers, Andrej --- "JOAQUIN LOPEZ MU?Z" <joaquin@tid.es> wrote:
----- Mensaje original ----- De: Andrej van der Zee <mavdzee@yahoo.co.uk> Fecha: Jueves, Junio 14, 2007 7:10 pm Asunto: [Boost-users] multi_index_container and hash_key lookup with boostboost-1.33.1 Para: Boost-users@lists.boost.org
Hi,
I have a problem with a hash-index to a member of type std::vector<std::strings>. With boost 1.34 it compiles and runs find, but it fails to compile with 1.33! [...] typedef std::vector<std::string> keys_type;
struct entry_type { keys_type keys;
bool operator<(const entry_type& e) const { ... } }; [...] error: no matching function for call to ?hash_value(const std::vector<...>&)? [...]
Hi Andrej, to teach the compiler to hash vectors you've got to include <boost/functional/hash/vector.hpp>. Starting from Boost 1.34, all the hash/*.hpp headers are deprecated and you should only use <boost/functional/hash.hpp>.
Joaquín y López Muñoz Telefónica, Investigación y Desarrollo _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users
___________________________________________________________ Yahoo! Mail is the world's favourite email. Don't settle for less, sign up for your free account today http://uk.rd.yahoo.com/evt=44106/*http://uk.docs.yahoo.com/mail/winter07.htm...
participants (2)
-
"JOAQUIN LOPEZ MU?Z"
-
Andrej van der Zee