W pewnych okolicznościach deserializacja klasy z prywatnym konstruktorem nie działa z Boostem 1.58. W 1.57 wszystko działało dobrze. Poniższy kod, skompilowany przy użyciu programu Visual Studio 2013, wyświetla następujący komunikat o błędzie.Zwiększona serializacja z prywatnym konstruktorem działa w 1.57 nie w 1.58
komunikat o błędzie:
1> SerializeTest.cpp
1>c:\program files (x86)\vc\include\xmemory0(588): error C2248: 'A::A' : cannot access private member declared in class 'A'
1> c:\projects\serializetest\serializetest.cpp(14) : see declaration of 'A::A'
1> c:\projects\serializetest\serializetest.cpp(9) : see declaration of 'A'
Kod:
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/vector.hpp>
#include <vector>
#include <sstream>
class A
{
public:
A(int i) {}
private:
A() {}
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive& ar, const unsigned int version)
{
}
};
class B
{
public:
B() {}
private:
std::vector<A> m_a;
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive& ar, const unsigned int version)
{
ar & BOOST_SERIALIZATION_NVP(m_a);
}
};
int main(int argc, char* argv[])
{
std::ostringstream os;
boost::archive::text_oarchive oa(os);
{
B b;
oa & b;
}
{
std::stringstream myIstream;
myIstream.write(os.str().c_str(), os.str().length());
boost::archive::text_iarchive ia(myIstream);
B b;
ia >> b;
}
return 0;
}
Czy to regresja doładowania lub przeoczenie przeze mnie?
Myślę, że wpadłem na to na drugi dzień. Winiłem siebie (ponieważ nie miałem bazy kodu dla tego konkretnego problemu). Możesz to powtórzyć w śledzącym problemie – sehe
Zrobiłem ten sam problem, +1 przy ustalaniu, że był to problem w 1.58, zajęłoby mi dużo czasu – asimes