I'm trying to understand how to go about serializing allocated c style
string buffers using the serialization library.
The example code below gives a compile error (see bottom)
"left of '.serialize' must have class/struct/union type"
and I don't see how to fix this. Could someone point me in the right
direction?
In the meantime I'm using std::string, but this doesn't meet my needs.
Many thanks for any help. Tom
-----------------------------
#include
#include <fstream>
#include
#include
template<class T>
class test
{
public:
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & boost::serialization::make_nvp("p", p);
}
test()
{
p = 0;
}
~test()
{
delete p;
}
explicit test(const T *t)
{
size_t len = std::char_traits<T>::length(t);
p = new T[len+1];
std::char_traits<T>::copy(p, t, len+1);
}
const T *get() const
{
return p;
}
private:
T *p;
};
void sertest()
{
test<char> t("Hello");
std::ofstream ofs("test.txt");
boost::archive::text_oarchive oa(ofs);
oa << t;
ofs.close();
}
------------------------------
------ Build started: Project: test, Configuration: Debug Win32 ------
Compiling...
sertest.cpp
c:\Proj\boost\include\boost-1_32\boost\serialization\access.hpp(106) :
error C2228: left of '.serialize' must have class/struct/union type
type is 'type'
c:\Proj\boost\include\boost-1_32\boost\serialization\serialization.hpp(7
8) : see reference to function template instantiation 'void
boost::serialization::access::serialize(Archive &,T &,const
unsigned int)' being compiled
with
[
Archive=boost::archive::text_oarchive,
T=type
]
c:\Proj\boost\include\boost-1_32\boost\serialization\serialization.hpp(1
21) : see reference to function template instantiation 'void
boost::serialization::serialize(Archive &,T &,const unsigned
int)' being compiled
with
[
Archive=boost::archive::text_oarchive,
T=type
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\oserializer.hpp(15
2) : see reference to function template instantiation 'void
boost::serialization::serialize_adl(Archive &,T &,const
unsigned int)' being compiled
with
[
Archive=boost::archive::text_oarchive,
T=type
]
c:\Proj\boost\include\boost-1_32\boost\serialization\extended_type_info_
typeid.hpp(100) : while compiling class-template member function 'void
boost::archive::detail::oserializer::save_object_data(boost::
archive::detail::basic_oarchive &,const void *) const'
with
[
Archive=boost::archive::text_oarchive,
T=type
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\oserializer.hpp(16
3) : see reference to class template instantiation
'boost::archive::detail::oserializer' being compiled
with
[
Archive=boost::archive::text_oarchive,
T=type
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\oserializer.hpp(16
2) : while compiling class-template member function 'const
boost::archive::detail::basic_oserializer
&boost::archive::detail::pointer_oserializer::get_basic_seria
lizer(void) const'
with
[
T=type,
Archive=boost::archive::text_oarchive
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\oserializer.hpp(53
0) : see reference to class template instantiation
'boost::archive::detail::pointer_oserializer' being compiled
with
[
T=type,
Archive=boost::archive::text_oarchive
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\interface_oarchive
.hpp(65) : see reference to function template instantiation 'const
boost::archive::detail::basic_pointer_oserializer
&boost::archive::detail::instantiate_pointer_oserializer(Arch
ive *,T *)' being compiled
with
[
Archive=boost::ar
chive::text_oarchive,
T=type
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\oserializer.hpp(33
2) : see reference to function template instantiation 'const
boost::archive::detail::basic_pointer_oserializer
*boost::archive::detail::interface_oarchive<Archive>::register_type<T>(T
*)' being compiled
with
[
Archive=boost::archive::text_oarchive,
T=type
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\oserializer.hpp(33
1) : while compiling class-template member function 'const
boost::archive::detail::basic_pointer_oserializer
*boost::archive::detail::save_pointer_type::non_abstract
::register_type(Archive &)'
with
[
Archive=boost::archive::text_oarchive,
TPtr=char *,
T=type
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\oserializer.hpp(34
9) : see reference to class template instantiation
'boost::archive::detail::save_pointer_type::non_abstract
' being compiled
with
[
Archive=boost::archive::text_oarchive,
TPtr=char *,
T=type
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\oserializer.hpp(47
5) : see reference to function template instantiation 'const
boost::archive::detail::basic_pointer_oserializer
*boost::archive::detail::save_pointer_type::register_type<
T>(Archive &,T &)' being compiled
with
[
Archive=boost::archive::text_oarchive,
TPtr=char *,
T=char
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\oserializer.hpp(46
2) : while compiling class-template member function 'void
boost::archive::detail::save_pointer_type::invoke(Archive
&,const TPtr)'
with
[
Archive=boost::archive::text_oarchive,
TPtr=char *
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\oserializer.hpp(55
1) : see reference to class template instantiation
'boost::archive::detail::save_pointer_type' being compiled
with
[
Archive=boost::archive::text_oarchive,
TPtr=char *
]
c:\Proj\boost\include\boost-1_32\boost\archive\basic_text_oarchive.hpp(7
1) : see reference to function template instantiation 'void
boost::archive::save(Archive &,const T & )' being compiled
with
[
Archive=boost::archive::text_oarchive,
T=char *
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\interface_oarchive
.hpp(80) : see reference to function template instantiation 'void
boost::archive::basic_text_oarchive<Archive>::save_override<T>(const T &
,int)' being compiled
with
[
Archive=boost::archive::text_oarchive,
T=char *
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\interface_oarchive
.hpp(110) : see reference to function template instantiation 'Archive
&boost::archive::detail::interface_oarchive<Archive>::operator
<<<T>(const T & )' being compiled
with
[
Archive=boost::archive::text_oarchive,
T=char *
]
c:\Proj\boost\include\boost-1_32\boost\serialization\nvp.hpp(58)
: see reference to function template instantiation 'Archive
&boost::archive::detail::interface_oarchive<Archive>::operator &<T>(T &
)' being compiled
with
[
Archive=boost::archive::text_oarchive,
T=char *
]
c:\Proj\boost\include\boost-1_32\boost\serialization\access.hpp(106) :
see reference to function template instantiation 'void
boost::serialization::nvp<T>::serialize<Archive>(Archive &,const
unsigned int) const' being compiled
with
[
T=char *,
Archive=boost::archive::text_oarchive
]
c:\Proj\boost\include\boost-1_32\boost\serialization\serialization.hpp(7
8) : see reference to function template instantiation 'void
boost::serialization::access::serialize(Archive &,T &,const
unsigned int)' being compiled
with
[
Archive=boost::archive::text_oarchive,
T=boost::serialization::nvp
]
c:\Proj\boost\include\boost-1_32\boost\serialization\serialization.hpp(1
21) : see reference to function template instantiation 'void
boost::serialization::serialize(Archive &,T &,const unsigned
int)' being compiled
with
[
Archive=boost::archive::text_oarchive,
T=boost::serialization::nvp
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\oserializer.hpp(22
7) : see reference to function template instantiation 'void
boost::serialization::serialize_adl(Archive &,T &,const
unsigned int)' being compiled
with
[
Archive=boost::archive::text_oarchive,
T=boost::serialization::nvp
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\oserializer.hpp(22
2) : while compiling class-template member function 'void
boost::archive::detail::save_non_pointer_type::save_only::inv
okex(Archive &,const T &)'
with
[
Archive=boost::archive::text_oarchive,
T=boost::serialization::nvp
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\oserializer.hpp(30
9) : see reference to class template instantiation
'boost::archive::detail::save_non_pointer_type::save_only'
being compiled
with
[
Archive=boost::archive::text_oarchive,
T=boost::serialization::nvp
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\oserializer.hpp(23
7) : while compiling class-template member function 'void
boost::archive::detail::save_non_pointer_type::invoke(Archive
&,const T &)'
with
[
Archive=boost::archive::text_oarchive,
T=boost::serialization::nvp
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\oserializer.hpp(55
1) : see reference to class template instantiation
'boost::archive::detail::save_non_pointer_type' being
compiled
with
[
Archive=boost::archive::text_oarchive,
T=boost::serialization::nvp
]
c:\Proj\boost\include\boost-1_32\boost\archive\basic_text_oarchive.hpp(7
1) : see reference to function template instantiation 'void
boost::archive::save(Archive &,const T &)' being compiled
with
[
Archive=boost::archive::text_oarchive,
T=boost::serialization::nvp
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\interface_oarchive
.hpp(87) : see reference to function template instantiation 'void
boost::archive::basic_text_oarchive<Archive>::save_override<T>(const T
&,int)' being compiled
with
[
Archive=boost::archive::text_oarchive,
T=boost::serialization::nvp
]
c:\Proj\lnp\core\test\sertest.cpp(14) : see reference to
function template instantiation 'Archive
&boost::archive::detail::interface_oarchive<Archive>::operator
&(const boost::serialization::nvp<T> &)'
being compiled
with
[
Archive=boost::archive::text_oarchive,
T=char *
]
c:\Proj\boost\include\boost-1_32\boost\serialization\access.hpp(106) :
see reference to function template instantiation 'void
test<T>::serialize<Archive>(Archive &,const unsigned int)' being
compiled
with
[
T=char,
Archive=boost::archive::text_oarchive
]
c:\Proj\boost\include\boost-1_32\boost\serialization\serialization.hpp(7
8) : see reference to function template instantiation 'void
boost::serialization::access::serialize(Archive &,T &,const
unsigned int)' being compiled
with
[
Archive=boost::archive::text_oarchive,
T=test<char>
]
c:\Proj\boost\include\boost-1_32\boost\serialization\serialization.hpp(1
21) : see reference to function template instantiation 'void
boost::serialization::serialize(Archive &,T &,const unsigned
int)' being compiled
with
[
Archive=boost::archive::text_oarchive,
T=test<char>
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\oserializer.hpp(15
2) : see reference to function template instantiation 'void
boost::serialization::serialize_adl(Archive &,T &,const
unsigned int)' being compiled
with
[
Archive=boost::archive::text_oarchive,
T=test<char>
]
c:\Proj\boost\include\boost-1_32\boost\serialization\extended_type_info_
typeid.hpp(100) : while compiling class-template member function 'void
boost::archive::detail::oserializer::save_object_data(boost::
archive::detail::basic_oarchive &,const void *) const'
with
[
Archive=boost::archive::text_oarchive,
T=test<char>
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\oserializer.hpp(23
4) : see reference to class template instantiation
'boost::archive::detail::oserializer' being compiled
with
[
Archive=boost::archive::text_oarchive,
T=test<char>
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\oserializer.hpp(23
3) : while compiling class-template member function 'void
boost::archive::detail::save_non_pointer_type::save::invokex(
Archive &,const T &)'
with
[
Archive=boost::archive::text_oarchive,
T=test<char>
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\oserializer.hpp(30
9) : see reference to class template instantiation
'boost::archive::detail::save_non_pointer_type::save' being
compiled
with
[
Archive=boost::archive::text_oarchive,
T=test<char>
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\oserializer.hpp(23
7) : while compiling class-template member function 'void
boost::archive::detail::save_non_pointer_type::invoke(Archive
&,const T &)'
with
[
Archive=boost::archive::text_oarchive,
T=test<char>
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\oserializer.hpp(55
1) : see reference to class template instantiation
'boost::archive::detail::save_non_pointer_type' being
compiled
with
[
Archive=boost::archive::text_oarchive,
T=test<char>
]
c:\Proj\boost\include\boost-1_32\boost\archive\basic_text_oarchive.hpp(7
1) : see reference to function template instantiation 'void
boost::archive::save(Archive &,const T &)' being compiled
with
[
Archive=boost::archive::text_oarchive,
T=test<char>
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\interface_oarchive
.hpp(80) : see reference to function template instantiation 'void
boost::archive::basic_text_oarchive<Archive>::save_override<T>(const T
&,int)' being compiled
with
[
Archive=boost::archive::text_oarchive,
T=test<char>
]
c:\Proj\boost\include\boost-1_32\boost\archive\detail\interface_oarchive
.hpp(105) : see reference to function template instantiation 'Archive
&boost::archive::detail::interface_oarchive<Archive>::operator
<<(const test<T> &)' being compiled
with
[
Archive=boost::archive::text_oarchive,
T=char
]
c:\Proj\lnp\core\test\sertest.cpp(55) : see reference to
function template instantiation 'Archive
&boost::archive::detail::interface_oarchive<Archive>::operator
<<(test<T> &)' being compiled
with
[
Archive=boost::archive::text_oarchive,
T=char
]
test - 1 error(s), 0 warning(s)
---------------------- Done ----------------------
Build: 0 succeeded, 1 failed, 0 skipped