Boost logo

Boost :

From: Vladimir Prus (ghost_at_[hidden])
Date: 2005-05-06 04:54:50


Hi Robert,
I've just updated by Boost tree and run in a number of compile errors.

One is pretty easy -- I've committed the attached trivial patch to
split_member.hpp.

Another is this:

....boost/boost/archive/detail/oserializer.hpp:551: error: incomplete
   type `boost::STATIC_ASSERTION_FAILURE<false>' does not have member `value'

instantiated from this code of mine:

        ofstream ofs(av[2]);
        boost::archive::binary_oarchive oa(ofs);
        oa << *data_builder.finish();

Where 'finish' returns auto_ptr<Data>. It's looks like serialization checks if
the serialized type is 'const' and if not, complains. Basically, it's some
heuritic to prevent saving on-stack object (though I don't understand why it
would work at al).

I find this a bit too much . I have no reason whatsoever to make 'finish'
return auto_ptr<const Data>. And writing

        oa << const_cast<const Data&>(*data_builder.finish());

looks very strange. And modifying all places where I get this error is not
nice too. So, can this static assert be removed?

Then, I get ambiguity in iserializer.hpp, in this code:

#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
template<class Archive, class T>
inline void load(Archive &ar, const serialization::nvp<T> &t){
    load(ar, const_cast<serialization::nvp<T> &>(t));
}

For some reason, both boost::archive::load and some other 'load' in 'boost'
namespace (part of earlier serialization lib) that I still use are considered
overload candidates. Adding explicit boost::archive:: fixes this. See
attached patch.

Then I get error at this code:

    ar << boost::lexical_cast<std::string>(*this);

The error message is:

error: no match for 'operator<<' in 'ar <<
   boost::lexical_cast(Source) [with Target = std::basic_string<char,
   std::char_traits<char>, std::allocator<char> >, Source =
   lvk::nm_model::BlockFormula]()'
/space/NM/boost/boost/archive/detail/interface_oarchive.hpp:75: error:
candidates
   are: Archive&
   boost::archive::detail::interface_oarchive<Archive>::operator<<(T&) [with T
   = std::basic_string<char, std::char_traits<char>, std::allocator<char> >,
   Archive = boost::archive::binary_oarchive]
   ...unrelated operator<< definitions snipped...

Apparently, passing rvalue to "T&" does not work. Yes another attached patch
fixes this issue.

- Volodya






Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk