2015-04-26 14 views
7

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?

+0

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

+0

Zrobiłem ten sam problem, +1 przy ustalaniu, że był to problem w 1.58, zajęłoby mi dużo czasu – asimes

Odpowiedz

0

Miałem ten sam problem, spójrz na nagłówek xmemory! Dla mnie błąd pojawił się na std :: podzielnika, więc musiałem dodać coś takiego

friend class std::allocator<A>; 

oprócz klasy znajomego do serializacji!