[serialization] loading a map having a const mapped value type

Hi all, I'm unable to address this use case of the serialization library. I have a standard map in which the mapped value is const: map<string, const Protocol *> _table; My serialize is very simple: ar & _table; (the test case source code is attached) However, this can't be compiled as I get many errors related to the loading code inside boost::serialization: /usr/include/boost/archive/detail/iserializer.hpp:488: error: reinterpret_cast from type 'const Protocol**' to type 'void**' casts away constness /usr/include/boost/archive/detail/iserializer.hpp:491: error: no matching function for call to 'boost::archive::detail::load_pointer_type<boost::archive::text_iarchive, const Protocol*>::pointer_tweak(const boost::serialization::extended_type_info&, const Protocol*&, const Protocol&)' /usr/include/boost/serialization/access.hpp:109: error: passing 'const Protocol' as 'this' argument of 'void Protocol::serialize(Archive&, unsigned int) [with Archive = boost::archive::text_iarchive]' discards qualifiers /usr/include/boost/archive/detail/iserializer.hpp: In member function 'void boost::archive::detail::pointer_iserializer<T, Archive>::load_object_ptr(boost::archive::detail::basic_iarchive&, void*&, unsigned int) const [with T = const Protocol, Archive = boost::archive::text_iarchive]': /usr/include/boost/archive/detail/iserializer.hpp:299: error: invalid conversion from 'const void*' to 'void*' /usr/include/boost/archive/detail/iserializer.hpp:307: error: invalid conversion from 'const void*' to 'void*' /usr/include/boost/archive/detail/iserializer.hpp:307: error: initializing argument 1 of 'void boost::archive::detail::basic_iarchive::next_object_pointer(void*)' /usr/include/boost/serialization/access.hpp:123: error: invalid conversion from 'const void*' to 'void*' /usr/include/boost/serialization/access.hpp:123: error: initializing argument 2 of 'void* operator new(size_t, void*)' /usr/include/boost/serialization/access.hpp:123: error: no matching function for call to 'Protocol::Protocol()' /usr/include/boost/archive/detail/iserializer.hpp:555: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>' /usr/include/boost/archive/detail/iserializer.hpp:555: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>' Can somebody share his wisdom on this please? Thanks! -- Marco Canini

Forgot to say that I'm using boost version 1.34. I'll try with a later version. Thanks On Mon, 31 Aug 2009 16:55:28 +0200, Marco Canini <marco.canini@epfl.ch> wrote:
Hi all,
I'm unable to address this use case of the serialization library. I have a standard map in which the mapped value is const: map<string, const Protocol *> _table;
My serialize is very simple: ar & _table;
(the test case source code is attached)
However, this can't be compiled as I get many errors related to the loading code inside boost::serialization:
/usr/include/boost/archive/detail/iserializer.hpp:488: error: reinterpret_cast from type 'const Protocol**' to type 'void**' casts away constness
/usr/include/boost/archive/detail/iserializer.hpp:491: error: no matching function for call to 'boost::archive::detail::load_pointer_type<boost::archive::text_iarchive, const Protocol*>::pointer_tweak(const boost::serialization::extended_type_info&, const Protocol*&, const Protocol&)'
/usr/include/boost/serialization/access.hpp:109: error: passing 'const Protocol' as 'this' argument of 'void Protocol::serialize(Archive&, unsigned int) [with Archive = boost::archive::text_iarchive]' discards qualifiers /usr/include/boost/archive/detail/iserializer.hpp: In member function 'void boost::archive::detail::pointer_iserializer<T, Archive>::load_object_ptr(boost::archive::detail::basic_iarchive&, void*&, unsigned int) const [with T = const Protocol, Archive = boost::archive::text_iarchive]':
/usr/include/boost/archive/detail/iserializer.hpp:299: error: invalid conversion from 'const void*' to 'void*' /usr/include/boost/archive/detail/iserializer.hpp:307: error: invalid conversion from 'const void*' to 'void*' /usr/include/boost/archive/detail/iserializer.hpp:307: error: initializing argument 1 of 'void boost::archive::detail::basic_iarchive::next_object_pointer(void*)'
/usr/include/boost/serialization/access.hpp:123: error: invalid conversion from 'const void*' to 'void*' /usr/include/boost/serialization/access.hpp:123: error: initializing argument 2 of 'void* operator new(size_t, void*)' /usr/include/boost/serialization/access.hpp:123: error: no matching function for call to 'Protocol::Protocol()'
/usr/include/boost/archive/detail/iserializer.hpp:555: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>' /usr/include/boost/archive/detail/iserializer.hpp:555: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>'
Can somebody share his wisdom on this please? Thanks!
-- Marco Canini

Try map<string, /* const */ Protocol *> _table; Robert Ramey Marco Canini wrote:
Hi all,
I'm unable to address this use case of the serialization library. I have a standard map in which the mapped value is const: map<string, const Protocol *> _table;
My serialize is very simple: ar & _table;
(the test case source code is attached)
However, this can't be compiled as I get many errors related to the loading code inside boost::serialization:
/usr/include/boost/archive/detail/iserializer.hpp:488: error: reinterpret_cast from type 'const Protocol**' to type 'void**' casts away constness
/usr/include/boost/archive/detail/iserializer.hpp:491: error: no matching function for call to 'boost::archive::detail::load_pointer_type<boost::archive::text_iarchive, const Protocol*>::pointer_tweak(const boost::serialization::extended_type_info&, const Protocol*&, const Protocol&)'
/usr/include/boost/serialization/access.hpp:109: error: passing 'const Protocol' as 'this' argument of 'void Protocol::serialize(Archive&, unsigned int) [with Archive = boost::archive::text_iarchive]' discards qualifiers /usr/include/boost/archive/detail/iserializer.hpp: In member function 'void boost::archive::detail::pointer_iserializer<T, Archive>::load_object_ptr(boost::archive::detail::basic_iarchive&, void*&, unsigned int) const [with T = const Protocol, Archive = boost::archive::text_iarchive]':
/usr/include/boost/archive/detail/iserializer.hpp:299: error: invalid conversion from 'const void*' to 'void*' /usr/include/boost/archive/detail/iserializer.hpp:307: error: invalid conversion from 'const void*' to 'void*' /usr/include/boost/archive/detail/iserializer.hpp:307: error: initializing argument 1 of 'void boost::archive::detail::basic_iarchive::next_object_pointer(void*)'
/usr/include/boost/serialization/access.hpp:123: error: invalid conversion from 'const void*' to 'void*' /usr/include/boost/serialization/access.hpp:123: error: initializing argument 2 of 'void* operator new(size_t, void*)' /usr/include/boost/serialization/access.hpp:123: error: no matching function for call to 'Protocol::Protocol()'
/usr/include/boost/archive/detail/iserializer.hpp:555: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>' /usr/include/boost/archive/detail/iserializer.hpp:555: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>'
Can somebody share his wisdom on this please? Thanks!
-- Marco Canini
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users

Thanks! I know that will work. My problem is that the program I'm applying boost to uses const and I'd rather not modify that. On Mon, 31 Aug 2009 18:31:31 +0200, Robert Ramey <ramey@rrsd.com> wrote:
Try map<string, /* const */ Protocol *> _table;
Robert Ramey
Marco Canini wrote:
Hi all,
I'm unable to address this use case of the serialization library. I have a standard map in which the mapped value is const: map<string, const Protocol *> _table;
My serialize is very simple: ar & _table;
(the test case source code is attached)
However, this can't be compiled as I get many errors related to the loading code inside boost::serialization:
/usr/include/boost/archive/detail/iserializer.hpp:488: error: reinterpret_cast from type 'const Protocol**' to type 'void**' casts away constness
/usr/include/boost/archive/detail/iserializer.hpp:491: error: no matching function for call to 'boost::archive::detail::load_pointer_type<boost::archive::text_iarchive, const Protocol*>::pointer_tweak(const boost::serialization::extended_type_info&, const Protocol*&, const Protocol&)'
/usr/include/boost/serialization/access.hpp:109: error: passing 'const Protocol' as 'this' argument of 'void Protocol::serialize(Archive&, unsigned int) [with Archive = boost::archive::text_iarchive]' discards qualifiers /usr/include/boost/archive/detail/iserializer.hpp: In member function 'void boost::archive::detail::pointer_iserializer<T, Archive>::load_object_ptr(boost::archive::detail::basic_iarchive&, void*&, unsigned int) const [with T = const Protocol, Archive = boost::archive::text_iarchive]':
/usr/include/boost/archive/detail/iserializer.hpp:299: error: invalid conversion from 'const void*' to 'void*' /usr/include/boost/archive/detail/iserializer.hpp:307: error: invalid conversion from 'const void*' to 'void*' /usr/include/boost/archive/detail/iserializer.hpp:307: error: initializing argument 1 of 'void boost::archive::detail::basic_iarchive::next_object_pointer(void*)'
/usr/include/boost/serialization/access.hpp:123: error: invalid conversion from 'const void*' to 'void*' /usr/include/boost/serialization/access.hpp:123: error: initializing argument 2 of 'void* operator new(size_t, void*)' /usr/include/boost/serialization/access.hpp:123: error: no matching function for call to 'Protocol::Protocol()'
/usr/include/boost/archive/detail/iserializer.hpp:555: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>' /usr/include/boost/archive/detail/iserializer.hpp:555: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>'
Can somebody share his wisdom on this please? Thanks!
-- Marco Canini
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
-- Marco Canini

Am Monday 31 August 2009 17:43:31 schrieb Marco Canini:
Thanks! I know that will work. My problem is that the program I'm applying boost to uses const and I'd rather not modify that.
either: http://www.boost.org/doc/libs/1_40_0/libs/serialization/doc/serialization.ht... or a free function that constructs the type, like you do with references: http://www.boost.org/doc/libs/1_40_0/libs/serialization/doc/serialization.ht...

Unfortunately using 1.40 doesn't fix my problem. Can somebody please tell me if the test code I attached in my first post could ever work? Thanks! On Mon, 31 Aug 2009 21:30:33 +0200, Stefan Strasser <strasser@uni-bremen.de> wrote:
Am Monday 31 August 2009 17:43:31 schrieb Marco Canini:
Thanks! I know that will work. My problem is that the program I'm applying boost to uses const and I'd rather not modify that.
either: http://www.boost.org/doc/libs/1_40_0/libs/serialization/doc/serialization.ht...
or a free function that constructs the type, like you do with references: http://www.boost.org/doc/libs/1_40_0/libs/serialization/doc/serialization.ht...
-- Marco Canini

Am Tuesday 01 September 2009 12:15:33 schrieb Marco Canini:
Unfortunately using 1.40 doesn't fix my problem. Can somebody please tell me if the test code I attached in my first post could ever work? Thanks!
this has nothing to do with 1.40, the links just happen to be part of the 1.40 documentation. I don't think there have been any changes recently. your question is addressed in those links:
either: http://www.boost.org/doc/libs/1_40_0/libs/serialization/doc/serialization .html#const
or a free function that constructs the type, like you do with references: http://www.boost.org/doc/libs/1_40_0/libs/serialization/doc/serialization .html#references
participants (3)
-
Marco Canini
-
Robert Ramey
-
Stefan Strasser