[Boost-bugs] [Boost C++ Libraries] #2180: Errors on binary serialization of vector

Subject: [Boost-bugs] [Boost C++ Libraries] #2180: Errors on binary serialization of vector
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2008-08-10 06:36:48


#2180: Errors on binary serialization of vector
---------------------------------------+------------------------------------
 Reporter: k_karanikolas_at_[hidden] | Owner: ramey
     Type: Bugs | Status: new
Milestone: To Be Determined | Component: serialization
  Version: Boost 1.35.0 | Severity: Problem
 Keywords: |
---------------------------------------+------------------------------------
 I am encountering compiler errors when trying to serialize objects stored
 in a vector, using boost 1.35, as well as boost svn.

 Here's a simplified test case
 {{{
 #include <fstream>
 #include <vector>
 #include <boost/archive/binary_oarchive.hpp>
 #include <boost/archive/text_oarchive.hpp>
 #include <boost/serialization/vector.hpp>
 void test()
 {
         std::vector<int> vec;
         std::ofstream ofs("file");

         // boost::archive::text_oarchive oarc(ofs); // Compiles fine under
 both GCC 4.0.1 and GCC 4.1
         boost::archive::binary_oarchive oarc(ofs); // Compiles under GCC
 4.0.1 but not GCC 4.1. Also compiles fine with boost 1.34/GCC 4.1

         oarc & vec;
 }
 }}}

 Whereas serializing to a text archive works fine under both compilers,
 binary serialization triggers compiler errors under GCC 4.1

 ------------------
 {{{
 /Users/kostas/develop/ext/boost/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp:
 In instantiation of ‘const int
 boost::mpl::aux::template_arity_impl<boost::archive::basic_binary_oprimitive<boost::archive::binary_oarchive,
 char, std::char_traits<char> >::use_array_optimization, 3>::value’:
 /Users/kostas/develop/ext/boost/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp:93:
 instantiated from ‘const int
 boost::mpl::aux::template_arity<boost::archive::basic_binary_oprimitive<boost::archive::binary_oarchive,
 char, std::char_traits<char> >::use_array_optimization>::value’
 /Users/kostas/develop/ext/boost/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp:98:
 instantiated from
 â€˜boost::mpl::aux::template_arity<boost::archive::basic_binary_oprimitive<boost::archive::binary_oarchive,
 char, std::char_traits<char> >::use_array_optimization>’
 /Users/kostas/develop/ext/boost/boost/mpl/aux_/preprocessed/gcc/apply.hpp:48:
 instantiated from
 â€˜boost::mpl::apply1<boost::archive::basic_binary_oprimitive<boost::archive::binary_oarchive,
 char, std::char_traits<char> >::use_array_optimization, int>’
 /Users/kostas/develop/ext/boost/boost/archive/binary_oarchive.hpp:53:
 instantiated from
 â€˜boost::serialization::use_array_optimization<boost::archive::binary_oarchive>::apply<int>’
 /Users/kostas/develop/ext/boost/boost/serialization/vector.hpp:119:
 instantiated from ‘void boost::serialization::save(Archive&, const
 std::vector<U, Allocator>&, unsigned int) [with Archive =
 boost::archive::binary_oarchive, U = int, Allocator =
 std::allocator<int>]’
 /Users/kostas/develop/ext/boost/boost/serialization/split_free.hpp:45:
 instantiated from ‘static void boost::serialization::free_saver<Archive,
 T>::invoke(Archive&, const T&, unsigned int) [with Archive =
 boost::archive::binary_oarchive, T = std::vector<int, std::allocator<int>
>]’
 /Users/kostas/develop/ext/boost/boost/serialization/split_free.hpp:74:
 instantiated from ‘void boost::serialization::split_free(Archive&, T&,
 unsigned int) [with Archive = boost::archive::binary_oarchive, T =
 std::vector<int, std::allocator<int> >]’
 /Users/kostas/develop/ext/boost/boost/serialization/vector.hpp:139:
 instantiated from ‘void boost::serialization::serialize(Archive&,
 std::vector<U, Allocator>&, unsigned int) [with Archive =
 boost::archive::binary_oarchive, U = int, Allocator =
 std::allocator<int>]’
 /Users/kostas/develop/ext/boost/boost/serialization/serialization.hpp:133:
 instantiated from ‘void boost::serialization::serialize_adl(Archive&, T&,
 unsigned int) [with Archive = boost::archive::binary_oarchive, T =
 std::vector<int, std::allocator<int> >]’
 /Users/kostas/develop/ext/boost/boost/archive/detail/oserializer.hpp:144:
 instantiated from ‘void boost::archive::detail::oserializer<Archive,
 T>::save_object_data(boost::archive::detail::basic_oarchive&, const void*)
 const [with Archive = boost::archive::binary_oarchive, T =
 std::vector<int, std::allocator<int> >]’
 test3.cpp:15: instantiated from here
 /Users/kostas/develop/ext/boost/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp:85:
 error: call of overloaded
 â€˜arity_helper(boost::mpl::aux::type_wrapper<boost::archive::basic_binary_oprimitive<boost::archive::binary_oarchive,
 char, std::char_traits<char> >::use_array_optimization>,
 boost::mpl::aux::arity_tag<3>)’ is ambiguous
 /Users/kostas/develop/ext/boost/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp:30:
 note: candidates are: char (& boost::mpl::aux::arity_helper(...))[1]
 /Users/kostas/develop/ext/boost/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp:51:
 note: char (&
 boost::mpl::aux::arity_helper(boost::mpl::aux::type_wrapper<F<T1, T2, T3>
>, boost::mpl::aux::arity_tag<3>))[4] [with F =
 boost::archive::basic_binary_oprimitive<Archive, Elem,
 Tr>::use_array_optimization, T1 = boost::archive::binary_oarchive, T2 =
 char, T3 = std::char_traits<char>]
 /Users/kostas/develop/ext/boost/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp:51:
 note: char (&
 boost::mpl::aux::arity_helper(boost::mpl::aux::type_wrapper<F<T1, T2, T3>
>, boost::mpl::aux::arity_tag<3>))[4] [with F =
 boost::archive::basic_binary_oprimitive<Archive, Elem,
 Tr>::use_array_optimization, T1 = boost::archive::binary_oarchive, T2 =
 char, T3 = std::char_traits<char>]
 /Users/kostas/develop/ext/boost/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp:
 In instantiation of ‘const int
 boost::mpl::aux::template_arity<boost::archive::basic_binary_oprimitive<boost::archive::binary_oarchive,
 char, std::char_traits<char> >::use_array_optimization>::value’:
 /Users/kostas/develop/ext/boost/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp:98:
 instantiated from
 â€˜boost::mpl::aux::template_arity<boost::archive::basic_binary_oprimitive<boost::archive::binary_oarchive,
 char, std::char_traits<char> >::use_array_optimization>’
 /Users/kostas/develop/ext/boost/boost/mpl/aux_/preprocessed/gcc/apply.hpp:48:
 instantiated from
 â€˜boost::mpl::apply1<boost::archive::basic_binary_oprimitive<boost::archive::binary_oarchive,
 char, std::char_traits<char> >::use_array_optimization, int>’
 /Users/kostas/develop/ext/boost/boost/archive/binary_oarchive.hpp:53:
 instantiated from
 â€˜boost::serialization::use_array_optimization<boost::archive::binary_oarchive>::apply<int>’
 /Users/kostas/develop/ext/boost/boost/serialization/vector.hpp:119:
 instantiated from ‘void boost::serialization::save(Archive&, const
 std::vector<U, Allocator>&, unsigned int) [with Archive =
 boost::archive::binary_oarchive, U = int, Allocator =
 std::allocator<int>]’
 /Users/kostas/develop/ext/boost/boost/serialization/split_free.hpp:45:
 instantiated from ‘static void boost::serialization::free_saver<Archive,
 T>::invoke(Archive&, const T&, unsigned int) [with Archive =
 boost::archive::binary_oarchive, T = std::vector<int, std::allocator<int>
>]’
 /Users/kostas/develop/ext/boost/boost/serialization/split_free.hpp:74:
 instantiated from ‘void boost::serialization::split_free(Archive&, T&,
 unsigned int) [with Archive = boost::archive::binary_oarchive, T =
 std::vector<int, std::allocator<int> >]’
 /Users/kostas/develop/ext/boost/boost/serialization/vector.hpp:139:
 instantiated from ‘void boost::serialization::serialize(Archive&,
 std::vector<U, Allocator>&, unsigned int) [with Archive =
 boost::archive::binary_oarchive, U = int, Allocator =
 std::allocator<int>]’
 /Users/kostas/develop/ext/boost/boost/serialization/serialization.hpp:133:
 instantiated from ‘void boost::serialization::serialize_adl(Archive&, T&,
 unsigned int) [with Archive = boost::archive::binary_oarchive, T =
 std::vector<int, std::allocator<int> >]’
 /Users/kostas/develop/ext/boost/boost/archive/detail/oserializer.hpp:144:
 instantiated from ‘void boost::archive::detail::oserializer<Archive,
 T>::save_object_data(boost::archive::detail::basic_oarchive&, const void*)
 const [with Archive = boost::archive::binary_oarchive, T =
 std::vector<int, std::allocator<int> >]’
 test3.cpp:15: instantiated from here
 /Users/kostas/develop/ext/boost/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp:93:
 error: ‘<expression error>’ is not a valid template argument for type
 â€˜int’ because it is a non-constant expression
 /Users/kostas/develop/ext/boost/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp:
 In instantiation of
 â€˜boost::mpl::aux::template_arity<boost::archive::basic_binary_oprimitive<boost::archive::binary_oarchive,
 char, std::char_traits<char> >::use_array_optimization>’:
 /Users/kostas/develop/ext/boost/boost/mpl/aux_/preprocessed/gcc/apply.hpp:48:
 instantiated from
 â€˜boost::mpl::apply1<boost::archive::basic_binary_oprimitive<boost::archive::binary_oarchive,
 char, std::char_traits<char> >::use_array_optimization, int>’
 /Users/kostas/develop/ext/boost/boost/archive/binary_oarchive.hpp:53:
 instantiated from
 â€˜boost::serialization::use_array_optimization<boost::archive::binary_oarchive>::apply<int>’
 /Users/kostas/develop/ext/boost/boost/serialization/vector.hpp:119:
 instantiated from ‘void boost::serialization::save(Archive&, const
 std::vector<U, Allocator>&, unsigned int) [with Archive =
 boost::archive::binary_oarchive, U = int, Allocator =
 std::allocator<int>]’
 /Users/kostas/develop/ext/boost/boost/serialization/split_free.hpp:45:
 instantiated from ‘static void boost::serialization::free_saver<Archive,
 T>::invoke(Archive&, const T&, unsigned int) [with Archive =
 boost::archive::binary_oarchive, T = std::vector<int, std::allocator<int>
>]’
 /Users/kostas/develop/ext/boost/boost/serialization/split_free.hpp:74:
 instantiated from ‘void boost::serialization::split_free(Archive&, T&,
 unsigned int) [with Archive = boost::archive::binary_oarchive, T =
 std::vector<int, std::allocator<int> >]’
 /Users/kostas/develop/ext/boost/boost/serialization/vector.hpp:139:
 instantiated from ‘void boost::serialization::serialize(Archive&,
 std::vector<U, Allocator>&, unsigned int) [with Archive =
 boost::archive::binary_oarchive, U = int, Allocator =
 std::allocator<int>]’
 /Users/kostas/develop/ext/boost/boost/serialization/serialization.hpp:133:
 instantiated from ‘void boost::serialization::serialize_adl(Archive&, T&,
 unsigned int) [with Archive = boost::archive::binary_oarchive, T =
 std::vector<int, std::allocator<int> >]’
 /Users/kostas/develop/ext/boost/boost/archive/detail/oserializer.hpp:144:
 instantiated from ‘void boost::archive::detail::oserializer<Archive,
 T>::save_object_data(boost::archive::detail::basic_oarchive&, const void*)
 const [with Archive = boost::archive::binary_oarchive, T =
 std::vector<int, std::allocator<int> >]’
 test3.cpp:15: instantiated from here
 /Users/kostas/develop/ext/boost/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp:98:
 error: ‘<expression error>’ is not a valid template argument for type
 â€˜int’ because it is a non-constant expression
 /Users/kostas/develop/ext/boost/boost/mpl/aux_/preprocessed/gcc/apply.hpp:
 In instantiation of
 â€˜boost::mpl::apply1<boost::archive::basic_binary_oprimitive<boost::archive::binary_oarchive,
 char, std::char_traits<char> >::use_array_optimization, int>’:
 /Users/kostas/develop/ext/boost/boost/archive/binary_oarchive.hpp:53:
 instantiated from
 â€˜boost::serialization::use_array_optimization<boost::archive::binary_oarchive>::apply<int>’
 /Users/kostas/develop/ext/boost/boost/serialization/vector.hpp:119:
 instantiated from ‘void boost::serialization::save(Archive&, const
 std::vector<U, Allocator>&, unsigned int) [with Archive =
 boost::archive::binary_oarchive, U = int, Allocator =
 std::allocator<int>]’
 /Users/kostas/develop/ext/boost/boost/serialization/split_free.hpp:45:
 instantiated from ‘static void boost::serialization::free_saver<Archive,
 T>::invoke(Archive&, const T&, unsigned int) [with Archive =
 boost::archive::binary_oarchive, T = std::vector<int, std::allocator<int>
>]’
 /Users/kostas/develop/ext/boost/boost/serialization/split_free.hpp:74:
 instantiated from ‘void boost::serialization::split_free(Archive&, T&,
 unsigned int) [with Archive = boost::archive::binary_oarchive, T =
 std::vector<int, std::allocator<int> >]’
 /Users/kostas/develop/ext/boost/boost/serialization/vector.hpp:139:
 instantiated from ‘void boost::serialization::serialize(Archive&,
 std::vector<U, Allocator>&, unsigned int) [with Archive =
 boost::archive::binary_oarchive, U = int, Allocator =
 std::allocator<int>]’
 /Users/kostas/develop/ext/boost/boost/serialization/serialization.hpp:133:
 instantiated from ‘void boost::serialization::serialize_adl(Archive&, T&,
 unsigned int) [with Archive = boost::archive::binary_oarchive, T =
 std::vector<int, std::allocator<int> >]’
 /Users/kostas/develop/ext/boost/boost/archive/detail/oserializer.hpp:144:
 instantiated from ‘void boost::archive::detail::oserializer<Archive,
 T>::save_object_data(boost::archive::detail::basic_oarchive&, const void*)
 const [with Archive = boost::archive::binary_oarchive, T =
 std::vector<int, std::allocator<int> >]’
 test3.cpp:15: instantiated from here
 /Users/kostas/develop/ext/boost/boost/mpl/aux_/preprocessed/gcc/apply.hpp:48:
 error: ‘<expression error>’ is not a valid template argument for type
 â€˜int’ because it is a non-constant expression
 /Users/kostas/develop/ext/boost/boost/archive/binary_oarchive.hpp: In
 instantiation of
 â€˜boost::serialization::use_array_optimization<boost::archive::binary_oarchive>::apply<int>’:
 /Users/kostas/develop/ext/boost/boost/serialization/vector.hpp:119:
 instantiated from ‘void boost::serialization::save(Archive&, const
 std::vector<U, Allocator>&, unsigned int) [with Archive =
 boost::archive::binary_oarchive, U = int, Allocator =
 std::allocator<int>]’
 /Users/kostas/develop/ext/boost/boost/serialization/split_free.hpp:45:
 instantiated from ‘static void boost::serialization::free_saver<Archive,
 T>::invoke(Archive&, const T&, unsigned int) [with Archive =
 boost::archive::binary_oarchive, T = std::vector<int, std::allocator<int>
>]’
 /Users/kostas/develop/ext/boost/boost/serialization/split_free.hpp:74:
 instantiated from ‘void boost::serialization::split_free(Archive&, T&,
 unsigned int) [with Archive = boost::archive::binary_oarchive, T =
 std::vector<int, std::allocator<int> >]’
 /Users/kostas/develop/ext/boost/boost/serialization/vector.hpp:139:
 instantiated from ‘void boost::serialization::serialize(Archive&,
 std::vector<U, Allocator>&, unsigned int) [with Archive =
 boost::archive::binary_oarchive, U = int, Allocator =
 std::allocator<int>]’
 /Users/kostas/develop/ext/boost/boost/serialization/serialization.hpp:133:
 instantiated from ‘void boost::serialization::serialize_adl(Archive&, T&,
 unsigned int) [with Archive = boost::archive::binary_oarchive, T =
 std::vector<int, std::allocator<int> >]’
 /Users/kostas/develop/ext/boost/boost/archive/detail/oserializer.hpp:144:
 instantiated from ‘void boost::archive::detail::oserializer<Archive,
 T>::save_object_data(boost::archive::detail::basic_oarchive&, const void*)
 const [with Archive = boost::archive::binary_oarchive, T =
 std::vector<int, std::allocator<int> >]’
 test3.cpp:15: instantiated from here
 /Users/kostas/develop/ext/boost/boost/archive/binary_oarchive.hpp:53:
 error: no type named ‘type’ in ‘struct
 boost::mpl::apply1<boost::archive::basic_binary_oprimitive<boost::archive::binary_oarchive,
 char, std::char_traits<char> >::use_array_optimization, int>’
 /Users/kostas/develop/ext/boost/boost/serialization/vector.hpp: In
 function ‘void boost::serialization::save(Archive&, const std::vector<U,
 Allocator>&, unsigned int) [with Archive =
 boost::archive::binary_oarchive, U = int, Allocator =
 std::allocator<int>]’:
 /Users/kostas/develop/ext/boost/boost/serialization/split_free.hpp:45:
 instantiated from ‘static void boost::serialization::free_saver<Archive,
 T>::invoke(Archive&, const T&, unsigned int) [with Archive =
 boost::archive::binary_oarchive, T = std::vector<int, std::allocator<int>
>]’
 /Users/kostas/develop/ext/boost/boost/serialization/split_free.hpp:74:
 instantiated from ‘void boost::serialization::split_free(Archive&, T&,
 unsigned int) [with Archive = boost::archive::binary_oarchive, T =
 std::vector<int, std::allocator<int> >]’
 /Users/kostas/develop/ext/boost/boost/serialization/vector.hpp:139:
 instantiated from ‘void boost::serialization::serialize(Archive&,
 std::vector<U, Allocator>&, unsigned int) [with Archive =
 boost::archive::binary_oarchive, U = int, Allocator =
 std::allocator<int>]’
 /Users/kostas/develop/ext/boost/boost/serialization/serialization.hpp:133:
 instantiated from ‘void boost::serialization::serialize_adl(Archive&, T&,
 unsigned int) [with Archive = boost::archive::binary_oarchive, T =
 std::vector<int, std::allocator<int> >]’
 /Users/kostas/develop/ext/boost/boost/archive/detail/oserializer.hpp:144:
 instantiated from ‘void boost::archive::detail::oserializer<Archive,
 T>::save_object_data(boost::archive::detail::basic_oarchive&, const void*)
 const [with Archive = boost::archive::binary_oarchive, T =
 std::vector<int, std::allocator<int> >]’
 test3.cpp:15: instantiated from here
 /Users/kostas/develop/ext/boost/boost/serialization/vector.hpp:119: error:
 no type named ‘type’ in ‘struct
 boost::serialization::use_array_optimization<boost::archive::binary_oarchive>::apply<int>’
 }}}

 ----------------------

 My compiler versions are
 {{{
 Using built-in specs.
 Target: powerpc-apple-darwin9
 Configured with: /var/tmp/gcc/gcc-5465~16/src/configure --disable-checking
 -enable-werror --prefix=/usr --mandir=/share/man --enable-
 languages=c,objc,c++,obj-c++ --program-transform-
 name=/^[cg][^.-]*$/s/$/-4.0/ --with-gxx-include-dir=/include/c++/4.0.0
 --with-slibdir=/usr/lib --build=i686-apple-darwin9 --program-prefix=
 --host=powerpc-apple-darwin9 --target=powerpc-apple-darwin9
 Thread model: posix
 gcc version 4.0.1 (Apple Inc. build 5465)
 }}}

 {{{
 Using built-in specs.
 Target: psp
 Configured with: ../configure --prefix=/Users/kostas/develop/psp/pspdev
 --target=psp --enable-languages=c,c++ --with-newlib --enable-cxx-flags=-G0
 Thread model: single
 gcc version 4.1.0 (PSPDEV 20060507)
 }}}

 Thanks in advance

-- 
Ticket URL: <http://svn.boost.org/trac/boost/ticket/2180>
Boost C++ Libraries <http://www.boost.org/>
Boost provides free peer-reviewed portable C++ source libraries.

This archive was generated by hypermail 2.1.7 : 2017-02-16 18:49:58 UTC